在之前的博客中潜入三角洲湖:打开事务日志而且潜入三角洲湖:模式实施与进化,我们描述了Delta Lake事务日志是如何工作的,以及模式实施和演进的内部原理。Delta Lake支持DML(数据操纵语言)命令,包括删除
,更新
,合并
。这些命令简化了变更数据捕获(CDC),审计和治理,GDPR / CCPA工作流等等。在这篇文章中,我们将演示如何使用这些DML命令,描述Delta Lake在运行其中一个命令时在幕后做什么,并为每个命令提供一些性能调优技巧。更具体地说:
- 三角洲湖ACID交易日志的快速入门
- 理解运行DELETE、UPDATE和MERGE时的基本原理
- 理解执行这些任务时执行的操作
- 了解三角洲湖分区修剪的基本知识
- 流查询如何在Delta Lake中工作
如果你喜欢看这些信息,你也可以查看潜入Delta Lake第3部分:DELETE, UPDATE和MERGE如何工作技术讨论。
三角洲湖:基本机制
如果你想了解更多关于三角洲湖的基本机制,请展开下面的部分。
单击可展开
首先,让我们快速回顾一下Delta Lake表在文件级别上是如何构造的。创建新表时,Delta将数据保存为一系列Parquet文件,并创建_delta_log
文件夹,其中包含Delta Lake事务日志。ACID事务日志作为对您的表所做的每一个更改(称为事务)的主记录。在修改表时(例如,通过添加新数据或执行更新、合并或删除),Delta Lake将每个新事务的记录保存为JSON文件delta_log
以00…00000. json
数起来。每10个事务,Delta还在同一文件夹中生成一个“检查点”Parquet文件,允许读者快速重新创建表的状态。
最终,当您查询Delta Lake表时,受支持的读取器会参考事务日志,以快速确定哪些数据文件构成了表的最新版本。它提供了所需文件的确切路径,而不是列出云对象存储中的文件,从而显著提高了查询性能。对于DML操作,就像我们在这篇文章中讨论的那样,Delta Lake创建了新的文件版本,而不是在原地修改它们——并使用事务日志来跟踪它。BOB低频彩阅读本系列的上一篇文章了解更多信息,潜入三角洲湖:打开事务日志。
现在您已经基本了解了Delta Lake在文件系统级别上是如何工作的,下面让我们深入了解如何在Delta Lake上使用DML命令,以及每个操作在底层是如何工作的。下面的例子将使用SQL语法作为Delta Lake 0.7.0和Apache Spark 3.0的一部分;有关更多信息,请参阅在Apache Spark 3.0的Delta Lake中启用Spark SQL DDL和DML。
三角洲湖DML:更新
您可以使用更新
操作来有选择地更新与筛选条件匹配的任何行谓词。下面的代码演示了如何将每种类型的谓词用作谓词的一部分更新
声明。
——更新事件更新事件集eventType=“点击”在哪里eventType=“clck”
更新:在引擎盖下
三角洲湖执行更新
在桌子上分两步:
- 查找并选择包含与谓词匹配且因此需要更新的数据的文件。三角洲湖的用途数据不只要有可能,就要加快这个过程。
- 将每个匹配的文件读入内存,更新相关行,并将结果写入一个新的数据文件。
一旦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:清除旧数据文件
运行真空
命令永久删除以下数据文件:
- 不再是活动表的一部分,而且
- 超过保留阈值(默认为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
条款,访问文档。
合并:在引擎盖下
三角洲湖完成了合并
分两步。
- 执行一个内连接在目标表和源表之间选择所有匹配的文件。
- 执行一个外连接在目标表和源表中选择的文件之间,并写出更新/删除/插入的数据。
它与更新
或者一个删除
在引擎盖下是三角洲湖使用的连接要完成合并
。这一事实允许我们在寻求提高性能时使用一些独特的策略。
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