最佳实践:三角洲湖

本文描述了在使用三角洲湖的最佳实践。

砖优化,请参阅优化建议砖

提供数据位置提示

如果你期望一个列中常用查询谓词,如果这一列具有较高的基数(即大量不同值),然后使用z值通过。三角洲湖自动列出了文件中的数据基于列值和使用布局信息查询时跳过不相关的数据。

有关详细信息,请参见数据不与z顺序索引三角洲湖

紧凑的文件

如果你不断写数据到表δ,它会随着时间的推移积累大量的文件,特别是如果你在小批量添加数据。这可以在表读取的效率有不利影响,它也会影响您的文件系统的性能。理想情况下,大量的小文件应该改写成一个小数量的大文件定期。这就是所谓的压实。

你可以紧凑的表使用优化命令。

请注意

这个操作不删除旧的文件。删除它们,运行真空命令。

替换一个表的内容或模式

有时你可能想要取代三角洲表。例如:

  • 你发现表中的数据是不正确的,想替换内容。

  • 你想要重写整个表做不兼容的模式变化(如改变列类型)。

虽然您可以删除整个目录的三角洲表并创建一个新表在同一路径,它是不推荐因为:

  • 删除一个目录是无效的。一个目录包含了非常大的文件可以删除几小时甚至几天。

  • 你失去了所有的内容被删除的文件;很难恢复,如果你删除错误的表。

  • 目录删除不是原子。当你删除表并发查询阅读表看失败或部分表。

如果你不需要改变表模式,你可以删除数据从一个δ表并插入新的数据,或更新表修复错误的值。

如果你想改变表模式,您可以自动替换整个表。例如:

dataframe\格式(“δ”)\模式(“覆盖”)\选项(“overwriteSchema”,“真正的”)\saveAsTable(“<表>”)#管理表dataframe\格式(“δ”)\模式(“覆盖”)\选项(“overwriteSchema”,“真正的”)\选项(“路径”,“< your-table-path >”)\saveAsTable(“<表>”)#外部表
取代<你的- - - - - ->使用δ作为选择——管理表取代<你的- - - - - ->使用δ位置“< your-table-path >”作为选择——外部表
dataframe格式(“δ”)模式(“覆盖”)选项(“overwriteSchema”,“真正的”)saveAsTable(“<表>”)/ /管理表dataframe格式(“δ”)模式(“覆盖”)选项(“overwriteSchema”,“真正的”)选项(“路径”,“< your-table-path >”)saveAsTable(“<表>”)/ /外部表

这种方法有很多好处:

  • 覆盖一个表要快得多,因为它不需要列出目录递归地或删除任何文件。

  • 表的旧版本仍然存在。如果你删除错误的表可以轻松地检索旧数据使用时间旅行。看到工作与三角洲湖表的历史

  • 这是一个原子操作。并发查询仍然可以读取表当你删除表。

  • 因为三角洲湖酸交易担保,如果覆盖表失败,表将在其之前的状态。

另外,如果您想删除旧文件节省存储成本覆盖表之后,您可以使用真空删除它们。是优化的文件删除,通常比删除整个目录。

火花缓存

砖不建议你使用火花缓存为以下原因:

  • 你不丢失任何数据可以来自额外的过滤器添加缓存DataFrame

  • 被缓存的数据可能不会更新如果访问表使用一个不同的标识符(例如,您做的spark.table (x) .cache ()然后写表使用spark.write.save(/一些/路径)

三角洲湖和拼花之间的差异在Apache火花

三角洲湖自动处理以下操作。你永远不应该手动执行这些操作:

  • 刷新:三角洲表总是返回最新的信息,所以不需要调用刷新后手动更改。

  • 添加和删除分区:三角洲湖自动跟踪的分区表并更新列表中添加或删除数据。因此,没有必要改变(添加|删除)分区MSCK

  • 加载单个分区直接:阅读分区是没有必要的。例如,您不需要运行spark.read.format .load(“铺”)(“/数据/日期= 2017-01-01”)。相反,使用一个在哪里等数据跳过,条款spark.read.table(“<表名称>”)。(“日期=“2017-01-01”)

  • 不要手动修改数据文件:三角洲湖使用事务日志表自动提交更改。不直接修改、添加或删除铺三角洲表中的数据文件,因为这可能导致数据丢失或表腐败。

提高性能的三角洲湖合并

你可以减少花费的时间合并使用以下方法:

  • 减少匹配的搜索空间:默认情况下,合并操作搜索整个三角洲表来找到匹配的源表。加速的一种方式合并是减少搜索空间在比赛中通过添加已知约束条件。例如,假设您有一个表分区的国家日期你想使用合并为最后一天更新信息,一个特定的国家。添加以下条件使查询速度,它查找匹配只有在相关的分区:

    事件日期=当前日期()事件国家=“美国”

    此外,这个查询也可以减少冲突的机会与其他并发操作。看到隔离级别和写冲突砖为更多的细节。

  • 紧凑的文件:如果数据存储在许多小文件,读取的数据搜索匹配会变得缓慢。你可以紧凑的小文件到大文件来提高阅读的吞吐量。看到紧凑的数据文件与优化在三角洲湖获取详细信息。

  • 控制调整分区写道:合并多次操作打乱数据更新的数据计算和写作。任务的数量用于洗牌由火花控制会话配置spark.sql.shuffle.partitions。设置这个参数不仅控制并行性,也决定了输出文件的数量。增加价值增加并行,也产生大量的小的数据文件。

  • 启用优化写道:对于分区表,合并可以产生大量小文件的数量比洗牌分区。这是因为每一个洗牌的任务在多个分区,可以写多个文件,可以成为一个性能瓶颈。你可以减少文件通过启用优化写道。看到优化为三角洲湖砖

  • 优化文件大小在表:在砖运行时的8.2及以上,砖可以自动检测如果δ表频繁合并重写的操作文件,可以选择重写文件的大小减少的预期在未来进一步的文件改写。上看到的部分优化文件大小获取详细信息。

  • 低洗牌合并:在砖运行时的9.0及以上,低洗牌合并提供了一个优化的实现合并为最常见的工作负载提供更好的性能。此外,它保留了现有的数据布局优化等z值修改的数据。

管理数据近因

在每个查询的开始,三角洲表的表自动升级到最新版本。这个过程可以观察到在笔记本命令状态报告:更新δ表的状态。然而,当运行历史分析表,你不一定需要到最后一刻的数据,特别是对于流数据表经常被摄入。在这些情况下,查询可以运行在陈旧的三角洲表的快照。这种方法可以更低的延迟得到查询结果。

您可以配置你的表数据是通过设置引发会话配置spark.databricks.delta.stalenessLimit时间字符串值。例如,1 h,15米,1 d1小时15分钟,1天,分别。此配置特定于会话的,因此不会影响其他用户访问这个表与其他笔记本,工作,或者BI工具。此外,该设置并不妨碍您的表更新;它只可以防止一个查询需要等待表更新。在后台更新仍然发生,并将共享资源跨集群相当。如果超过限制过时,则查询将块表状态更新。

增强的低延迟查询的检查点

三角洲湖写道检查点三角洲的聚合状态表在一个优化的频率。这些检查站作为起点来计算表的最新状态。没有检查点,三角洲湖必须阅读大量的JSON文件(“δ”文件)代表提交的事务日志来计算表的状态。此外,列级统计三角洲湖使用来执行数据不存储在检查站。

重要的

三角洲湖检查点是不同的结构化流检查点

在砖运行时7.3 LTS以上,列级数据存储结构和JSON(向后兼容)。结构格式使三角洲湖读取要快得多,因为:

  • 三角洲湖不执行昂贵的JSON解析获得列级统计。

  • 镶木地板列修剪功能显著减少所需的I / O读取的数据列。

结构格式支持的集合优化减少三角洲湖读取操作的开销从秒到几十毫秒,大大减少了延迟短查询。

在检查站管理列级统计

你如何使用表格数据都写在检查站属性delta.checkpoint.writeStatsAsJsondelta.checkpoint.writeStatsAsStruct。如果两个表属性湖,δ不能执行数据跳过。

  • 批处理写的写数据的JSON和结构格式。delta.checkpoint.writeStatsAsJson真正的

  • delta.checkpoint.writeStatsAsStruct默认是未定义的。

  • 读者可用时使用结构体列,否则退到使用JSON列。

对于流媒体写道:

  • 砖运行时7.5及以上:写数据的JSON格式和结构格式。

  • 砖运行时7.3 LTS和7.4:写数据仅在JSON格式(检查点写延迟)的影响降到最低。也写结构格式,看看启用增强结构化流查询的检查点

重要的

增强检查站不失兼容开源三角洲湖读者。bob下载地址然而,设置delta.checkpoint.writeStatsAsJson可能影响专有三角洲湖读者。请联系您的供应商了解更多关于性能影响。BOB低频彩

启用增强结构化流查询的检查点

如果你的结构化流负载没有低延迟需求(subminute延迟),您可以启用增强检查点通过运行以下SQL命令:

改变(<- - - - - -的名字> |δ' <路径- - - - - -- - - - - -> ']TBLPROPERTIES(“delta.checkpoint.writeStatsAsStruct”=“真正的”)

还可以提高检查点写延迟通过设置下表属性:

改变(<- - - - - -的名字> |δ' <路径- - - - - -- - - - - -> ']TBLPROPERTIES(“delta.checkpoint.writeStatsAsStruct”=“真正的”,“delta.checkpoint.writeStatsAsJson”=“假”)

如果数据不不是有用的应用程序中,您可以设置这两个属性为false。然后不收集或书面统计。砖不建议这个配置。