过滤与分区列相关的列时的 Databricks 查询性能

Posted

技术标签:

【中文标题】过滤与分区列相关的列时的 Databricks 查询性能【英文标题】:Databricks query performance when filtering on a column correlated to the partition-column 【发布时间】:2021-10-14 18:36:23 【问题描述】:

设置:Delta-lake,Powerbi 使用的 Databricks SQL 计算。 我想知道以下场景:我们有一个列timestamp 和一个派生列date(这是timestamp 的日期),我们选择partitionby 日期。当我们查询时,我们在过滤器中使用timestamp不是日期。

我的理解是,databrikcs 先验不会连接时间戳和日期,并且似乎不会从分区中获得任何优势。但是由于文件实际上是由时间戳(隐式)分区的,所以当 databricks 查看所有文件的最小/最大时间戳时,它会发现它毕竟可以跳过大多数文件。因此,即使分区在我们没有在查询中显式使用的列上,我们似乎也可以获得相当大的好处。

    这是正确的吗? 以这种方式过滤掉文件与直接使用分区相比,性能成本(大致)是多少。 databricks 是否会将所有最小/最大信息都保存在内存中,还是必须出去查看每个查询的文件?

【问题讨论】:

【参考方案1】:

是的,Databricks 将通过data skipping 隐式利用此分区,因为将有与特定数据文件关联的最小/最大统计信息。最小/最大信息将从事务日志加载到内存中,但它需要决定每个查询需要命中哪些文件。但是因为所有内容都在内存中,所以在您拥有数十万个文件之前,性能开销应该不会很大。

您可能会考虑的一件事 - 使用 generated column 而不是显式的 date 列。将其声明为date GENERATED ALWAYS AS (CAST(timestampColumn AS DATE)),并按它进行分区。这样做的好处是当你在timestampColumn 上进行查询时,它应该自动对date 列进行分区过滤。

【讨论】:

以上是关于过滤与分区列相关的列时的 Databricks 查询性能的主要内容,如果未能解决你的问题,请参考以下文章

使用默认值添加不可为空的列时的 Oracle 错误

使用pyspark,spark + databricks时如何将完全不相关的列添加到数据框中

Azure Databricks:如何过滤数据框中不包含类似运算符的列?

在 Spark DataBricks 上创建表模式

无分区列性能的 Spark 下推过滤器

当没有动态列时,将多列和多行的列连接成一个 varchar 值