如何在 Databricks 中使用 OPTIMIZE ZORDER BY

Ana*_*les 5 pyspark databricks azure-databricks delta-lake databricks-sql

我有两个数据框(来自三角洲湖表),它们通过 id 列进行左连接。

SD1、SD2

%sql
select
    a.columnA,
    b.columnB,
from sd1 a
left outer join sd2 b
on a.id = b.id

   
Run Code Online (Sandbox Code Playgroud)

问题是我的查询需要很长时间,寻找改进结果的方法我找到了OPTIMIZE ZORDER BY Youtube视频

根据视频,如果列将成为where条件的一部分,则在对列进行排序时似乎很有用。

但由于两个数据帧在连接条件中使用 id,因此对该列进行排序是否有趣?

spark.sql(f'OPTIMIZE delta.`{sd1_delta_table_path}` ZORDER BY (id)')
Run Code Online (Sandbox Code Playgroud)

我脑海中遵循的逻辑是,如果我们首先订购该列,那么寻找它们进行匹配所需的时间就会更少。它是否正确 ?

提前致谢

Ale*_*Ott 6

OPTIMIZE ZORDER将相关数据放在一起可能会有所帮助,但它的用处可能取决于 ID 列使用的数据类型。 OPTIMIZE ZORDER依赖于数据跳过功能,该功能仅提供最小和最大统计信息,但当您的连接中有很大范围时可能没有用。

您还可以调整文件大小,以避免扫描太多较小的文件。

但根据我个人的经验,对于连接,布隆过滤器可以提供更好的性能,因为它们允许比数据跳过更有效地跳过文件。只需在 ID 列上构建布隆过滤器...