在Databricks上克隆一个表

属性可以在Databricks上创建特定版本的现有Delta Lake表的副本克隆命令。克隆体可以是深的,也可以是浅的。

克隆是Databricks运行时默认启用的Databricks独有特性。

Databricks还支持克隆Parquet和Iceberg表。看到增量克隆拼花和冰山表三角洲湖

克隆类型

  • 一个深克隆是一个克隆,它将源表数据除现有表的元数据外复制到克隆目标。此外,流元数据也被克隆,这样写入Delta表的流可以在源表上停止,并在克隆的目标表上从它停止的地方继续。

  • 一个浅克隆不将数据文件复制到克隆目标的克隆。表元数据等同于源数据。这些克隆的成本更低。

对深克隆或浅克隆所做的任何更改只影响克隆本身,而不影响源表。

克隆的元数据包括:模式、分区信息、不变量、可空性。仅对于深度克隆,流和复制到元数据也被克隆。未克隆的元数据是表描述和用户定义提交元数据

重要的

  • 浅克隆引用源目录中的数据文件。如果你跑了真空在源表上,客户端将不再能够读取引用的数据文件和FileNotFoundException会被扔。在这种情况下,在浅克隆上运行clone和replace将修复克隆。如果经常发生这种情况,请考虑使用不依赖于源表的深度克隆。

  • 深度克隆不依赖于克隆它们的源,但创建成本很高,因为深度克隆复制数据和元数据。

  • 克隆与取代如果目标在该路径上已经有表,则在该路径上不存在表,则创建Delta日志。您可以通过运行来清理任何现有数据真空

  • 如果存在一个现有的Delta表,则创建一个新的提交,其中包括来自源表的新元数据和新数据。这个新的提交是增量的,这意味着自上次克隆以来只有新的更改被提交到表中。

  • 克隆表不同于创建表格作为选择商品交易顾问基金.克隆除复制数据外,还复制源表的元数据。克隆还具有更简单的语法:您不需要指定分区、格式、不变量、可空性等,因为它们是从源表中获取的。

  • 克隆表具有独立于源表的历史记录。克隆表上的时间旅行查询与源表上的输入不同。

创建表格δ' /数据/目标/ '克隆δ' /数据// '——在/data/target上创建/data/source的深度克隆创建取代表格dbtarget_table克隆dbsource_table——替换目标创建表格如果存在δ' /数据/目标/ '克隆dbsource_table——如果目标表存在,则无操作创建表格dbtarget_table克隆δ' /数据/创建表格dbtarget_table克隆δ' /数据/版本作为版本创建表格dbtarget_table克隆δ' /数据/时间戳作为timestamp_expression——时间戳可以是" 2019-01-01 "或者date_sub(current_date(), 1)
delta.tables进口deltaTableDeltaTableforPath火花pathToTable#基于路径的表deltaTableDeltaTableforName火花的表# Hive基于metastore的表deltaTable克隆目标isShallow取代#克隆最新版本的源代码deltaTablecloneAtVersion版本目标isShallow取代#克隆特定版本的源代码#在特定的时间戳克隆源代码,例如timestamp= " 2019-01-01 "deltaTablecloneAtTimestamp时间戳目标isShallow取代
进口ioδ_瓦尔deltaTableDeltaTableforPath火花pathToTable瓦尔deltaTableDeltaTableforName火花的表deltaTable克隆目标isShallow取代//克隆最新版本的源代码deltaTablecloneAtVersion版本目标isShallow取代//克隆一个特定版本的源代码deltaTablecloneAtTimestamp时间戳目标isShallow取代//在特定时间戳克隆源代码
进口io.delta.tables。*DeltaTabledeltaTableDeltaTableforPath火花pathToTable);DeltaTabledeltaTableDeltaTableforName火花的表);deltaTable克隆目标isShallow取代//克隆最新版本的源代码deltaTablecloneAtVersion版本目标isShallow取代//克隆一个特定版本的源代码deltaTablecloneAtTimestamp时间戳目标isShallow取代//在特定时间戳克隆源代码

有关语法的详细信息,请参见创建表克隆

克隆指标

请注意

在Databricks Runtime 8.2及以上版本中可用。

克隆一旦操作完成,报告以下指标为单行数据帧:

  • source_table_size:正在克隆的源表的大小,以字节为单位。

  • source_num_of_files:源表中的文件数。

  • num_removed_files:如果表正在被替换,则当前表中有多少文件被移除。

  • num_copied_files:从源复制的文件个数(浅克隆为0)。

  • removed_files_size:从当前表中移除的文件的字节大小。

  • copied_files_size:复制到表中的文件的字节大小。

克隆指标示例

权限

您必须为Databricks表访问控制和您的云提供商配置权限。

表访问控制

深克隆和浅克隆都需要以下权限:

  • 选择源表的权限。

  • 如果你正在使用克隆要创建一个新表,创建对正在其中创建表的数据库的权限。

  • 如果你正在使用克隆要换一张桌子,你必须有修改允许在桌面上。

云提供商权限

如果您已经创建了一个深度克隆,那么读取该深度克隆的任何用户都必须具有对该克隆目录的读访问权。要对克隆进行更改,用户必须对克隆目录具有写访问权。

如果您已经创建了一个浅克隆,那么任何读取浅克隆的用户都需要读取原始表中的文件的权限,因为数据文件保留在具有浅克隆的源表中以及克隆的目录中。要对克隆进行更改,用户需要对克隆目录进行写访问。

使用克隆进行数据归档

数据可能需要保存的时间超过时间旅行或灾难恢复的可行时间。在这些情况下,您可以创建一个深度克隆来保存表在某个时间点的状态,以便存档。增量归档还可以保持源表的持续更新状态,以便进行灾难恢复。

——每月跑步创建取代表格δ' /一些/存档/路径克隆my_prod_table

使用克隆的ML模型复制

在进行机器学习时,您可能希望对训练ML模型的表的某个版本进行归档。未来的模型可以使用这个存档的数据集进行测试。

——在Delta表版本15上训练模型创建表格δ' /模型/数据集克隆entire_dataset版本作为15

在生产台上使用克隆进行短期实验

要在不破坏表的情况下在生产表上测试工作流,可以轻松地创建一个浅克隆。这允许您在包含所有生产数据但不影响任何生产工作负载的克隆表上运行任意工作流。

—执行浅克隆创建取代表格my_test克隆my_prod_table更新my_test在哪里user_id无效的真正的——进行一系列验证。曾经快乐的:-这应该利用克隆中的更新信息来修剪——如果可能的话,修改克隆文件合并my_prod_table使用my_testmy_testuser_id< = >my_prod_tableuser_id匹配my_testuser_id然后更新下降表格my_test

使用克隆方式共享数据

单个组织中的其他业务单元可能希望访问相同的数据,但可能不需要最新的更新。您可以为不同的业务单元提供具有不同权限的克隆,而不是直接提供对源表的访问。克隆的性能可以超过简单视图的性能。

—执行深度克隆创建取代表格shared_table克隆my_prod_table——授予其他用户访问共享表的权限格兰特选择shared_table' <用户-的名字> @ <用户->com

使用clone重写表属性

请注意

在Databricks Runtime 7.5及以上版本中可用。

表属性覆盖特别有用:

  • 在与不同业务单元共享数据时,用所有者或用户信息注释表。

  • 需要存档Delta表和时间旅行。您可以为存档表单独指定日志保留期。例如:

创建取代表格存档my_table克隆刺激my_tableTBLPROPERTIESδlogRetentionDuration“3650天”δdeletedFileRetentionDuration“3650天”位置“xx: / /归档/ my_table”
dtDeltaTableforName火花“prod.my_table”tblProps“delta.logRetentionDuration”“3650天”“delta.deletedFileRetentionDuration”“3650天”dt克隆“xx: / /归档/ my_table”isShallow取代真正的tblProps
瓦尔dtDeltaTableforName火花“prod.my_table”瓦尔tblProps地图“delta.logRetentionDuration”->“3650天”“delta.deletedFileRetentionDuration”->“3650天”dt克隆“xx: / /归档/ my_table”isShallow取代真正的属性tblProps