azure - 优化时间戳范围查询的 Delta Lake 分区

标签 azure pyspark query-optimization databricks delta-lake

我正在使用 Databricks 中的 Delta 表,该表由 Year 列分区,并且表中有一个时间戳列。我想优化查询以获取特定时间戳范围内的数据(例如,2019 年 1 月 21 日至 2019 年 12 月 4 日之间)。

df_filtered = df.filter((df.timestamp >= "2019-01-21") & (df.timestamp <= "2019-12-04"))

我知道分区可以帮助提高性能,但我不确定在基于时间戳范围进行查询时如何有效地利用它。尽管我没有直接查询 Year 分区列,但我想利用分区修剪来仅读取相关分区。

如何确保Year分区列与时间戳数据有效关联,以便分区修剪最适合时间戳范围查询?

最佳答案

Delta Table batch reads and writes 的文档提及:

Delta Lake may be able to generate partition filters for a query whenever a partition column is defined by one of the following expressions:

  • YEAR(col) and the type of col is TIMESTAMP.
  • (...)

这意味着如果您有一个表定义为:

CREATE TABLE a_table (
    timestamp TIMESTAMP,
    year INT GENERATED ALWAYS AS year(timestamp),
    [other columns]
) PARTITIONED BY (year);

然后 Databricks 将能够分析 timestamp 列上的过滤条件,并导出 year 的适当分区过滤器。以你的例子:

df = spark.table("a_table")
df_filtered = df.filter((df.timestamp >= "2019-01-21") & (df.timestamp <= "2019-12-04"))

它将添加分区过滤器year = 2019

关于azure - 优化时间戳范围查询的 Delta Lake 分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77134384/

相关文章:

Mysql查询优化-范围搜索

azure - 一个 MVC 应用程序的多个 Azure 项目

mysql - 查询缓存效率

python - 事件中心检查点数据未保存

python - 如何根据列中字符串的长度有条件地从 PySpark Dataframe StringType() 列中删除字符子串?

python - 优化旋转和填充

mysql - AWS EMR PySpark 连接到 mysql

php - 编码线程多接收者消息传递系统的最佳实践?

sql-server - 创建用户来运行 SQL 迁移脚本 Azure SQL

sql-server - Kubernetes SQL Server 或 Azure SQL Server PaaS