工程的博客

潜入三角洲湖:DML内部(更新,删除,合并)

2020年9月29日 工程的博客

分享这篇文章

在之前的博客中潜入三角洲湖:打开事务日志而且潜入三角洲湖:模式实施与进化,我们描述了Delta Lake事务日志是如何工作的,以及模式实施和演进的内部原理。Delta Lake支持DML(数据操纵语言)命令,包括删除更新,合并。这些命令简化了变更数据捕获(CDC)审计和治理,GDPR / CCPA工作流等等。在这篇文章中,我们将演示如何使用这些DML命令,描述Delta Lake在运行其中一个命令时在幕后做什么,并为每个命令提供一些性能调优技巧。更具体地说:

  • 三角洲湖ACID交易日志的快速入门
  • 理解运行DELETE、UPDATE和MERGE时的基本原理
  • 理解执行这些任务时执行的操作
  • 了解三角洲湖分区修剪的基本知识
  • 流查询如何在Delta Lake中工作

如果你喜欢看这些信息,你也可以查看潜入Delta Lake第3部分:DELETE, UPDATE和MERGE如何工作技术讨论。

三角洲湖:基本机制

如果你想了解更多关于三角洲湖的基本机制,请展开下面的部分。

三角洲湖DML:更新

您可以使用更新操作来有选择地更新与筛选条件匹配的任何行谓词。下面的代码演示了如何将每种类型的谓词用作谓词的一部分更新声明。

——更新事件更新事件eventType=“点击”在哪里eventType=“clck”

更新:在引擎盖下

三角洲湖执行更新在桌子上分两步:

  1. 查找并选择包含与谓词匹配且因此需要更新的数据的文件。三角洲湖的用途数据不只要有可能,就要加快这个过程。
  2. 将每个匹配的文件读入内存,更新相关行,并将结果写入一个新的数据文件。

Delta Lake Under the Hood:使用UPDATE命令替换文件。

一旦Delta Lake执行了更新它成功地在事务日志中添加了一个提交,表明从现在开始将使用新的数据文件取代旧的数据文件。但是,旧的数据文件不会被删除。相反,它只是被“墓碑化”——记录为一个数据文件,应用于表的旧版本,而不是当前版本。Delta Lake能够使用它来提供数据版本控制和时间旅行。

更新+三角洲湖时间旅行=易于调试

保留旧的数据文件对于调试非常有用,因为您可以使用Delta Lake“时间旅行”在任何时候返回并查询表的以前版本。如果您不正确地更新了表,并希望找出发生了什么,您可以很容易地将表的两个版本进行比较。

SELECT *事件的版本作为12

更新:性能调优技巧

提高性能的主要途径是更新在三角洲湖上的命令是增加更多的谓词来缩小搜索空间。搜索越具体,Delta Lake需要扫描和/或修改的文件就越少。

Databricks管理版本的Delta Lake具有其他性能增强,如改进数据不,布隆滤光片的使用,以及z值优化(多维聚类),它类似于多列排序的改进版本。z顺序将重新组织每个数据文件的布局,以便有策略地将相似的列值放在彼此附近,以获得最大效率。阅读更多关于Z-Order优化在Databricks

三角洲湖DML:删除

您可以使用删除命令根据谓词(过滤条件)有选择地删除行。

删除事件在哪里日期
              你想要的事件还原一个偶然事件删除操作时,可以使用时间旅行回滚表格当时的情况是,作为证明了下面的Python代码片段。
              <精准医疗>阅读正确版本表格内存dt=spark.read.format \(“δ”).option(“versionAsOf”,4)\.load (deltaPath)#覆盖当前的表格DataFrame内存dt.write.format \(“δ”).mode \(“覆盖”).save (deltaPath)

DELETE:在引擎盖下

删除就像更新在引擎盖下面。Delta Lake对数据进行两次扫描:第一次扫描是识别包含匹配谓词条件的行的任何数据文件。第二次扫描将匹配的数据文件读入内存,此时Delta Lake删除相关行,然后将新清理的数据写入磁盘。

三角洲湖完成后删除如果操作成功,旧的数据文件不会被删除——它们仍然保留在磁盘上,但是在Delta Lake事务日志中被记录为“tombstoned”(不再是活动表的一部分)。请记住,这些旧文件不会立即删除,因为您可能仍然需要它们来时间旅行回到表的早期版本。如果要删除早于某个时间段的文件,可以使用真空命令。

DELETE + VACUUM:清除旧数据文件

运行真空命令永久删除以下数据文件:

  1. 不再是活动表的一部分,而且
  2. 超过保留阈值(默认为7天)。

三角洲湖并不是自动的真空旧文件-您必须自己运行该命令,如下所示。如果您希望指定的保留期限不同于默认的7天,则可以将其作为参数提供。

delta.tables进口*旧版本不需要# vacuum文件#保留时间,默认为168小时(7天)dt.vacuum ()deltaTable.vacuum (48#清除超过48小时的文件
警告:运行保留时间为0小时的VACUUM将删除表的最新版本中没有使用的所有文件。确保在正在对表进行活动写操作时不运行此命令,因为可能会发生数据丢失。

有关的更多信息真空命令,以及它在Scala和SQL中的示例,看看VACUUM命令的文档

DELETE:性能调优技巧

就像更新命令,主要是提高性能的一种方法删除在三角洲湖的行动是增加更多的谓词来缩小搜索空间。Databricks管理版本的Delta Lake还具有其他性能增强,如改进数据不,布隆滤光片的使用,以及z值优化(多维集群)。阅读更多关于Z-Order优化在Databricks

三角洲湖DML:合并

三角洲湖合并命令允许您执行“upserts”,这是一个混合更新和一个插入。为了理解upserts,假设您有一个现有的表(又名a目标表),以及源表其中包含新记录和对现有记录的更新。下面是upsert的工作原理:

  • 当从源表中记录时匹配先前存在的记录在目标表Delta Lake中更新备案。
  • 当有没有匹配三角洲湖插入新纪录。
合并事件使用更新events.eventId=updates.eventId匹配然后更新events.data=updates.data匹配然后插入日期, eventId, data)日期, eventId, data)

三角洲湖合并命令极大地简化了使用其他传统数据格式(如Parquet)时复杂而麻烦的工作流程。合并/upserts可以派上用处的常见场景包括变更数据捕获、GDPR/CCPA遵从性、会话化和记录重复数据删除。有关upserts的更多信息,请阅读博客文章高效Upserts到数据湖与Databricks Delta使用Python API对Delta Lake表进行简单、可靠的Upserts和delete,Delta Lake合并操作的模式演化与操作度量

有关的详细信息合并编程式操作,包括使用条件配合whenMatched条款,访问文档

合并:在引擎盖下

三角洲湖完成了合并分两步。

  1. 执行一个内连接在目标表和源表之间选择所有匹配的文件。
  2. 执行一个外连接在目标表和源表中选择的文件之间,并写出更新/删除/插入的数据。

Delta Lake Under the Hood:使用MERGE命令合并文件。

它与更新或者一个删除在引擎盖下是三角洲湖使用的连接要完成合并。这一事实允许我们在寻求提高性能时使用一些独特的策略。

MERGE:性能调优技巧

提高性能合并命令时,您需要确定组成合并的两个连接中哪一个限制了您的速度。

如果内连接是瓶颈(即,发现Delta Lake需要重写的文件太长了),尝试以下策略:

    • 添加更多谓词以缩小搜索空间。
    • 调整shuffle分区。
    • 调整广播连接阈值。
    • 如果表格中的小文件很多,就把它们压缩,但不要把它们压缩成大文件很大,因为Delta Lake必须复制整个文件来重写它。
在Databricks管理的Delta Lake上,使用Z-Order优化来利用更新的局部性。

另一方面,如果外连接是瓶颈(即重写实际文件本身花费太长时间),尝试以下策略:

  • 调整shuffle分区。
    • 可以为分区表生成太多小文件。
    • 通过在写入之前启用自动重分区来减少文件(使用优化写道三角洲湖
  • 调整广播阈值。如果你在做完整的外部连接,Spark不能做广播连接,但如果你在做正确的外部连接,Spark可以做一个,你可以根据需要调整广播阈值。
  • 缓存源表/数据帧。
    • 缓存源表可以加快第二次扫描,但一定不要缓存目标表,因为这会导致缓存一致性问题。

总结

Delta Lake支持DML命令,包括更新删除,合并成,大大简化了许多常见大数据操作的工作流程。在本文中,我们演示了如何在Delta Lake中使用这些命令,分享了关于每个命令的工作原理的信息,并提供了一些性能调优技巧。

对开源的Delta Lake感兴趣?bob下载地址
参观三角洲湖在线中心要了解BOB低频彩更多,请下载最新代码并加入Delta Lake社区。

相关的

本系列文章:
潜入三角洲湖#1:解压事务日志
潜入三角洲湖#2:模式实施与演进
潜入三角洲湖#3:DML内部(更新,删除,合并)

其他资源:
三角洲湖快速入门
关于更新、合并和删除的数据文档
使用Python api对Delta Lake表进行简单、可靠的upsert和delete

免费试用Databricks

相关的帖子

看到所有工程的博客的帖子