使用三角洲湖生成的列

预览

此功能已在公共预览

此特性在Databricks Runtime 8.3及以上版本上可用。

Delta Lake支持生成列,这些列是一种特殊类型的列,其值是基于用户指定的函数在Delta表中的其他列上自动生成的。当您写入带有已生成列的表并且没有显式地为它们提供值时,Delta Lake将自动计算这些值。例如,您可以从时间戳列自动生成一个日期列(用于按日期划分表);对表的任何写入都只需要指定时间戳列的数据。但是,如果显式地为它们提供值,则这些值必须满足约束(<值>< = ><代表达式>)真正的否则写入将失败并报错。

重要的

使用生成的列创建的表具有比默认更高的表写入协议版本。看到表协议版本控制了解表协议版本控制以及拥有更高版本的表协议意味着什么。

学习如何使用生成的列

下面的例子展示了如何创建一个包含已生成列的表:

创建表格默认的people10midINTfirstName字符串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”“字符串”addColumnDeltaTablecolumnBuilder“姓”数据类型“字符串”评论“姓”构建())addColumn“姓”“字符串”评论“姓”addColumn“性别”“字符串”addColumn“生日”“时间戳”addColumnDeltaTablecolumnBuilder“dateOfBirth”数据类型DateTypegeneratedAlwaysAsCAST(出生日期为日期)构建())addColumn“ssn”“字符串”addColumn“工资”“INT”执行()

生成的列将像普通列一样存储。也就是说,它们占用了存储空间。

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

  • 生成表达式可以使用Spark中的任何SQL函数,这些函数在给定相同的参数值时总是返回相同的结果,但以下类型的函数除外:

    • 用户自定义函数。

    • 聚合函数。

    • 窗口函数。

    • 函数返回多行。

  • 对于Databricks Runtime 9.1及以上版本,合并操作支持在设置时生成列spark.databricks.delta.schema.autoMerge.enabled为true。

在Databricks Runtime 8.4及以上版本的Photon支持下,Delta Lake可以为查询生成分区过滤器,无论分区列是由以下表达式之一定义的:

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

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

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

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

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

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

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

如果分区列是由前面的表达式之一定义的,并且查询使用生成表达式的底层基列筛选数据,那么Delta Lake将查看基列和生成的列之间的关系,并尽可能根据生成的分区列填充分区过滤器。例如,给定下表:

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

然后执行以下查询:

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

Delta Lake自动生成一个分区筛选器,以便前面的查询只读取分区中的数据日期= 2020-10-01即使没有指定分区筛选器。

作为另一个例子,给出下表:

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

然后执行以下查询:

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

Delta Lake自动生成一个分区筛选器,以便前面的查询只读取分区中的数据年= 2020 /月= 10 /天= 1即使没有指定分区筛选器。

你可以使用解释子句,并检查提供的计划,以查看Delta Lake是否自动生成任何分区过滤器。

在Delta Lake中使用身份栏

重要的

在Delta表上声明标识列将禁用并发事务。只在不需要并发写入目标表的用例中使用标识列。

Delta Lake标识列是一种生成的列,它为插入到表中的每个记录分配惟一值。您可以选择指定一个起始值和一个步长,它可以包括正数和负数。标识列仅支持长整型数字类型所支持的范围,则操作失败长整型数字

由标识列分配的值是唯一的,并且在指定步长的方向上递增,并且是指定步长的倍数,但不保证是连续的。

在插入操作期间,用户可以选择为标识列指定值,但可以使用总是关键字在标识列声明期间。

表不能按标识列进行分区,也不能对标识列执行更新操作。

不能向现有表添加标识列。若要创建具有标识列的表,请参见创建表[使用]

要了解如何将标识列值与数据同步,请参见ALTER TABLE