在Databricks上克隆一个表
属性可以在Databricks上创建特定版本的现有Delta Lake表的副本克隆
命令。克隆体可以是深的,也可以是浅的。
克隆是Databricks运行时默认启用的Databricks独有特性。
Databricks还支持克隆Parquet和Iceberg表。看到增量克隆拼花和冰山表三角洲湖.
克隆类型
一个深克隆是一个克隆,它将源表数据除现有表的元数据外复制到克隆目标。此外,流元数据也被克隆,这样写入Delta表的流可以在源表上停止,并在克隆的目标表上从它停止的地方继续。
一个浅克隆不将数据文件复制到克隆目标的克隆。表元数据等同于源数据。这些克隆的成本更低。
对深克隆或浅克隆所做的任何更改只影响克隆本身,而不影响源表。
克隆的元数据包括:模式、分区信息、不变量、可空性。仅对于深度克隆,流和复制到元数据也被克隆。未克隆的元数据是表描述和用户定义提交元数据.
重要的
浅克隆引用源目录中的数据文件。如果你跑了
真空
在源表上,客户端将不再能够读取引用的数据文件和FileNotFoundException
会被扔。在这种情况下,在浅克隆上运行clone和replace将修复克隆。如果经常发生这种情况,请考虑使用不依赖于源表的深度克隆。深度克隆不依赖于克隆它们的源,但创建成本很高,因为深度克隆复制数据和元数据。
克隆与
取代
如果目标在该路径上已经有表,则在该路径上不存在表,则创建Delta日志。您可以通过运行来清理任何现有数据真空
.如果存在一个现有的Delta表,则创建一个新的提交,其中包括来自源表的新元数据和新数据。这个新的提交是增量的,这意味着自上次克隆以来只有新的更改被提交到表中。
克隆表不同于
创建表格作为选择
或商品交易顾问基金
.克隆除复制数据外,还复制源表的元数据。克隆还具有更简单的语法:您不需要指定分区、格式、不变量、可空性等,因为它们是从源表中获取的。克隆表具有独立于源表的历史记录。克隆表上的时间旅行查询与源表上的输入不同。
创建表格δ.' /数据/目标/ '克隆δ.' /数据/源/ '——在/data/target上创建/data/source的深度克隆创建或取代表格db.target_table克隆db.source_table——替换目标创建表格如果不存在δ.' /数据/目标/ '克隆db.source_table——如果目标表存在,则无操作创建表格db.target_table浅克隆δ.' /数据/源`创建表格db.target_table浅克隆δ.' /数据/源`版本作为的版本创建表格db.target_table浅克隆δ.' /数据/源`时间戳作为的timestamp_expression——时间戳可以是" 2019-01-01 "或者date_sub(current_date(), 1)
从delta.tables进口*deltaTable=DeltaTable.forPath(火花,pathToTable)#基于路径的表deltaTable=DeltaTable.forName(火花,的表)# Hive基于metastore的表deltaTable.克隆(目标,isShallow,取代)#克隆最新版本的源代码deltaTable.cloneAtVersion(版本,目标,isShallow,取代)#克隆特定版本的源代码#在特定的时间戳克隆源代码,例如timestamp= " 2019-01-01 "deltaTable.cloneAtTimestamp(时间戳,目标,isShallow,取代)
进口io.δ.表._瓦尔deltaTable=DeltaTable.forPath(火花,pathToTable)瓦尔deltaTable=DeltaTable.forName(火花,的表)deltaTable.克隆(目标,isShallow,取代)//克隆最新版本的源代码deltaTable.cloneAtVersion(版本,目标,isShallow,取代)//克隆一个特定版本的源代码deltaTable.cloneAtTimestamp(时间戳,目标,isShallow,取代)//在特定时间戳克隆源代码
进口io.delta.tables。*;DeltaTabledeltaTable=DeltaTable.forPath(火花,pathToTable);DeltaTabledeltaTable=DeltaTable.forName(火花,的表);deltaTable.克隆(目标,isShallow,取代)//克隆最新版本的源代码deltaTable.cloneAtVersion(版本,目标,isShallow,取代)//克隆一个特定版本的源代码deltaTable.cloneAtTimestamp(时间戳,目标,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
:复制到表中的文件的字节大小。
使用克隆进行数据归档
数据可能需要保存的时间超过时间旅行或灾难恢复的可行时间。在这些情况下,您可以创建一个深度克隆来保存表在某个时间点的状态,以便存档。增量归档还可以保持源表的持续更新状态,以便进行灾难恢复。
——每月跑步创建或取代表格δ.' /一些/存档/路径`克隆my_prod_table
使用克隆的ML模型复制
在进行机器学习时,您可能希望对训练ML模型的表的某个版本进行归档。未来的模型可以使用这个存档的数据集进行测试。
——在Delta表版本15上训练模型创建表格δ.' /模型/数据集`克隆entire_dataset版本作为的15
在生产台上使用克隆进行短期实验
要在不破坏表的情况下在生产表上测试工作流,可以轻松地创建一个浅克隆。这允许您在包含所有生产数据但不影响任何生产工作负载的克隆表上运行任意工作流。
—执行浅克隆创建或取代表格my_test浅克隆my_prod_table;更新my_test在哪里user_id是零集无效的=真正的;——进行一系列验证。曾经快乐的:-这应该利用克隆中的更新信息来修剪——如果可能的话,修改克隆文件合并成my_prod_table使用my_test在my_test.user_id< = >my_prod_table.user_id当匹配和my_test.user_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”
dt=DeltaTable.forName(火花,“prod.my_table”)tblProps={“delta.logRetentionDuration”:“3650天”,“delta.deletedFileRetentionDuration”:“3650天”}dt.克隆(“xx: / /归档/ my_table”,isShallow=假,取代=真正的,tblProps)
瓦尔dt=DeltaTable.forName(火花,“prod.my_table”)瓦尔tblProps=地图(“delta.logRetentionDuration”->“3650天”,“delta.deletedFileRetentionDuration”->“3650天”)dt.克隆(“xx: / /归档/ my_table”,isShallow=假,取代=真正的,属性=tblProps)