克隆一个表在砖上

您可以创建一个复制现有的三角洲湖表使用砖在一个特定的版本克隆命令。克隆可以深或浅。

砖还支持克隆的镶木地板和冰山表。看到增量克隆拼花和冰山表三角洲湖

有关使用克隆和统一目录,看看统一目录管理表浅克隆

克隆类型

  • 一个深克隆是一个克隆,将源表的数据复制到克隆目标除了现有的元数据表。此外,流元数据也是克隆,这样一个流写入增量表可以停止在一个源表,继续克隆的目标从那里离开。

  • 一个浅克隆是一个克隆,不将数据文件复制到克隆的目标。表元数据相当于源。创建这些克隆更便宜。

克隆的元数据包括:模式、分区信息,不变量,nullability。深克隆,流和复制到元数据也是克隆。不是克隆表描述和元数据用户定义元数据提交

δ克隆操作的语义是什么?

如果你有使用三角洲表注册到蜂巢metastore或文件不是注册表的集合,克隆有以下语义:

重要的

在砖运行时的13.1及以上,统一目录管理表支持浅克隆。克隆语义统一编目表明显的区别于三角洲湖克隆语义在其他环境中。看到统一目录管理表浅克隆

  • 任何更改,深或浅克隆只影响克隆本身,而不是源表。

  • 浅克隆参考数据文件在源目录中。如果你运行真空源表,客户再也不能读取数据文件和引用FileNotFoundException抛出。在这种情况下,运行克隆与浅克隆克隆维修替换。如果发生这种情况,可以考虑使用深克隆,而这并不取决于源表。

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

  • 克隆与取代到目标,已经有一个表在路径创建一个δ日志如果不存在这条道路。你可以通过运行清理任何现有数据真空

  • 对于现有的三角洲表,创建一个新的提交,包括新的元数据和数据从源表。这个新提交增量,这意味着只有新变化自从上次克隆承诺表。

  • 克隆一个表是不一样的创建作为选择商品交易顾问基金。一个克隆复制源表的元数据除了数据。克隆也有简单的语法:你不需要指定分区,格式化,不变量,nullability等等,因为它们来自源表。

  • 一个克隆的表有一个独立的历史从源表。时间旅行查询在克隆表不工作和相同的输入源表。

例如克隆语法

下面的代码示例演示语法创建深和浅克隆:

创建δ' /数据/目标/ '克隆δ' /数据// '——创建一个深克隆/数据/源/数据/目标创建取代dbtarget_table克隆dbsource_table——替换目标创建如果存在δ' /数据/目标/ '克隆dbsource_table如果目标表存在——空操作创建dbtarget_table克隆δ' /数据/创建dbtarget_table克隆δ' /数据/版本作为版本创建dbtarget_table克隆δ' /数据/时间戳作为timestamp_expression——时间戳可以像“2019-01-01”或者像date_sub(当前日期(),1)
delta.tables进口*deltaTable=DeltaTableforPath(火花,pathToTable)#基于路径表,或deltaTable=DeltaTableforName(火花,的表)#蜂巢metastore-based表deltaTable克隆(目标,isShallow,取代)#克隆源在最新版本deltaTablecloneAtVersion(版本,目标,isShallow,取代)#克隆源在一个特定的版本#克隆源在特定时间戳等时间戳=“2019-01-01”deltaTablecloneAtTimestamp(时间戳,目标,isShallow,取代)
进口ioδ_瓦尔deltaTable=DeltaTableforPath(火花,pathToTable)瓦尔deltaTable=DeltaTableforName(火花,的表)deltaTable克隆(目标,isShallow,取代)/ /克隆源在最新版本deltaTablecloneAtVersion(版本,目标,isShallow,取代)/ /克隆源在一个特定的版本deltaTablecloneAtTimestamp(时间戳,目标,isShallow,取代)/ /克隆源在特定时间戳
进口io.delta.tables。*;DeltaTabledeltaTable=DeltaTableforPath(火花,pathToTable);DeltaTabledeltaTable=DeltaTableforName(火花,的表);deltaTable克隆(目标,isShallow,取代)/ /克隆源在最新版本deltaTablecloneAtVersion(版本,目标,isShallow,取代)/ /克隆源在一个特定的版本deltaTablecloneAtTimestamp(时间戳,目标,isShallow,取代)/ /克隆源在特定时间戳

语法细节,请参阅创建表克隆

克隆指标

请注意

在砖运行时8.2及以上。

克隆报告以下指标作为一个单独的行DataFrame操作完成后:

  • source_table_size:源表的大小被克隆的字节。

  • source_num_of_files:在源表文件的数量。

  • num_removed_files:如果表所取代,有多少文件从当前表中删除。

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

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

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

克隆指标的例子

权限

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

访问控制表

以下深和浅克隆所需权限:

  • 选择在源表权限。

  • 如果您使用的是克隆创建一个新表,创建允许在数据库中创建表。

  • 如果您使用的是克隆替换一个表,你必须有修改允许在桌子上。

云提供商的权限

如果您已经创建了一个深克隆,任何用户读取深克隆必须有读访问权克隆的目录。改变克隆,用户必须对克隆进行写访问的目录中。

如果您已经创建了一个浅克隆,允许任何用户读取浅克隆需要阅读原始表中的文件,由于数据文件仍在源表浅克隆,克隆的目录。更改克隆,用户将需要克隆的目录写访问。

使用克隆进行数据归档

您可以使用深克隆保存的状态表在某个时间点上归档的目的。可以同步深克隆增量维护更新状态的灾难恢复的源表。

——每个月运行创建取代δ' /一些/存档/路径克隆my_prod_table

使用克隆ML模式复制

做机器学习的时候,你可能想要归档的某些版本表你训练一个毫升模型。未来的模型可以使用这个归档数据集进行了测试。

——训练模型版本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;

使用克隆覆盖表属性

请注意

在砖运行时7.5及以上。

表属性覆盖尤其有用:

  • 注释表与业主或用户信息共享数据时不同的业务单位。

  • 归档三角洲表和表的历史或时间旅行是必需的。您可以指定数据和日志保留独立时期档案表。例如:

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