使用生成的列湖三角洲

预览

这个特性是在公共预览

请注意

这个特性可以在砖运行时8.3及以上。

三角洲湖支持生成的列是一种特殊类型的列的值是自动生成基于用户指定的函数在三角洲表中其他列。当你写与生成的列一个表,你没有明确为他们提供值,三角洲湖自动计算值。例如,您可以自动生成日期列(分区表的日期)从时间戳列;任何写进表只需要指定时间戳列的数据。然而,如果你明确地为他们提供值,必须满足的值约束(<值>< = ><代表达式>)真正的或与一个错误写会失败。

重要的

表创建表生成的列有更高的作家比默认协议版本。看到砖三角洲湖管理功能的兼容性如何?理解表协议版本控制和意味着什么有更高版本的表协议版本。

学习如何使用生成的列

下面的例子显示了如何创建一个表生成的列:

创建默认的people10m(idINT,firstName字符串,middleName字符串,字符串,性别字符串,生日时间戳,dateOfBirth日期生成的总是作为((生日作为日期)),ssn字符串,工资INT)
DeltaTable创建(火花)\的表(“default.people10m”)\addColumn(“id”,“INT”)\addColumn(“firstName”,“字符串”)\addColumn(“middleName”,“字符串”)\addColumn(“姓”,“字符串”,评论=“姓”)\addColumn(“性别”,“字符串”)\addColumn(“生日”,“时间戳”)\addColumn(“dateOfBirth”,DateType(),generatedAlwaysAs=“铸(生日日期)”)\addColumn(“ssn”,“字符串”)\addColumn(“工资”,“INT”)\执行()
DeltaTable创建(火花)的表(“default.people10m”)addColumn(“id”,“INT”)addColumn(“firstName”,“字符串”)addColumn(“middleName”,“字符串”)addColumn(DeltaTablecolumnBuilder(“姓”)数据类型(“字符串”)评论(“姓”)构建())addColumn(“姓”,“字符串”,评论=“姓”)addColumn(“性别”,“字符串”)addColumn(“生日”,“时间戳”)addColumn(DeltaTablecolumnBuilder(“dateOfBirth”)数据类型(DateType)generatedAlwaysAs(“铸(dateOfBirth日期)”)构建())addColumn(“ssn”,“字符串”)addColumn(“工资”,“INT”)执行()

生成的列存储当作正常的列。也就是说,他们占据存储。

以下限制适用于生成的列:

  • 一代表达式可以使用任何火花的SQL函数始终返回相同的结果给出相同的参数值时,除了以下类型的功能:

    • 用户自定义函数。

    • 聚合函数。

    • 窗口函数。

    • 函数返回多个行。

  • 砖运行时的9.1及以上,合并当你设定操作支持生成列spark.databricks.delta.schema.autoMerge.enabled为true。

与光子砖运行时8.4及以上的支持,三角洲湖可以生成分区时过滤器为一个查询分区列被定义为一个以下表达式:

  • 铸造(坳作为日期)和类型的上校时间戳

  • (col)和类型的上校时间戳

  • 两个分区列定义的年(col),月(col)和类型的上校时间戳

  • 三个分区列定义年(col),月(col),天(col)和类型的上校时间戳

  • 四个分区列定义的年(col),月(col),天(col),小时(col)和类型的上校时间戳

  • SUBSTRING(坳,pos机,兰)和类型的上校字符串

  • DATE_FORMAT(坳,格式)和类型的上校时间戳

    • 你只能使用日期的格式使用以下模式:yyyy-MMyyyy-MM-dd-HH

    • 在砖运行时10.4 LTS以上,您还可以使用以下模式:yyyy-MM-dd

如果一个分区列被定义为一个前面的表达式,使用底层的基础和查询过滤器数据列的表达式,一代三角洲湖看着基列之间的关系,生成的列,并填充分区过滤器生成基于分区列如果可能的话。例如,得到下表:

创建事件(eventId长整型数字,数据字符串,eventType字符串,eventTime时间戳,eventDate日期生成的总是作为((eventTime作为日期)))分区通过(eventType,eventDate)

如果你然后运行下面的查询:

选择*事件在哪里eventTime> =“2020-10-01”就是< =“2020-10-01 12:00:00”

三角洲湖自动生成一个分区过滤器,这样前面的查询只读取的数据分区日期= 2020-10-01即使没有指定分区过滤器。

另外一个例子,得到下表:

创建事件(eventId长整型数字,数据字符串,eventType字符串,eventTime时间戳,一年INT生成的总是作为(一年(eventTime)),INT生成的总是作为((eventTime)),一天INT生成的总是作为(一天(eventTime)))分区通过(eventType,一年,,一天)

如果你然后运行下面的查询:

选择*事件在哪里eventTime> =“2020-10-01”就是< =“2020-10-01 12:00:00”

三角洲湖自动生成一个分区过滤器,这样前面的查询只读取的数据分区年= 2020 /月= 10 /天= 1即使没有指定分区过滤器。

您可以使用一个解释条款和检查提供的计划是否三角洲湖自动生成任何分区过滤器。

使用标识列在三角洲湖

重要的

声明一个标识列在三角洲表禁用并发事务。只使用标识列在用例并发写入目标表不需要。

三角洲湖的身份列生成的列分配惟一的值的类型为每个记录插入到表中。您可以指定一个初始值和步长,可以包括积极的和消极的价值观。标识列只支持长整型数字如果指定值类型和操作失败超过支持的范围长整型数字

值指定的身份列是独特和增量的方向指定的步骤,在指定的步骤大小的倍数,但不保证是连续的。

用户可以选择指定标识列的值在insert操作,但这可以通过使用禁用总是在标识列关键字声明。

表无法分区的一个标识列,你不能标识列上执行更新操作。

你不能将标识列添加到现有表。与标识列创建一个表,看看创建表(使用)

学习与数据同步的身份列值,明白了ALTER TABLE