【问题标题】:Delta Lake partitioning strategy for event data事件数据的 Delta Lake 分区策略
【发布时间】:2023-03-30 04:48:01
【问题描述】:

我正在尝试构建一个可以摄取、存储和查询应用事件数据的系统。将来它将用于其他任务(ML、分析等),因此我认为 Databricks 可能是一个不错的选择(目前)。

主要用例是检索应用中发生的用户操作事件。 大约每 5 到 30 分钟会有一批此类事件数据进入 S3 存储桶,Databricks Auto Loader 会提取它们并将其存储在 Delta 表中。

一个典型的查询是:获取过去一天、一周或一个月内 colA = x 的所有事件。

我认为这里的典型策略是按日期分区。例如:

date_trunc("day", date) # 2020-04-11T00:00:00:00.000+000

这将在一年内创建 365 个分区。我希望每个分区能容纳大约 1GB 的数据。除了分区之外,我还计划对 where 子句中经常使用的高基数列之一使用 z 排序。

这是不是分区太多了? 有没有更好的方法来分区这些数据? 由于我按天进行分区并且数据每 5-30 分钟输入一次,是否可以只将数据“附加”到天分区?

【问题讨论】:

    标签: apache-spark databricks partitioning delta-lake


    【解决方案1】:

    这实际上取决于每天传入的数据量以及应读取多少文件来回答您的查询。如果它是 Gb 的 10 倍,那么每天分区就可以了。但是您也可以按截断为周的时间戳进行分区,在这种情况下,您每年只会获得 52 个分区。 ZOrdering 将有助于保持文件的优化,但如果您每 5-30 分钟添加一次数据,那么您每天将在分区内获得至少 24 个文件,因此您需要每晚使用 ZOrder 运行 OPTIMIZE ,或类似的东西,以减少文件的数量。另外,请确保您使用的是optimized writes - 虽然这会使写入操作变慢,但会减少生成的文件数量(如果您打算使用 ZOrdering,那么启用自动压缩没有意义)

    【讨论】:

    • 很好,因为 Delta 提供了哪个版本的自动优化功能?
    • @mike 它现在是 Databricks 独有的功能......我认为它是从 DBR 7.1 开始的(需要查看发行说明才能准确说明)
    • 谢谢。看起来不支持带有自动压缩的 Z-Ordeing,所以我将使用其中一个,我将启用优化写入。
    猜你喜欢
    • 1970-01-01
    • 2022-10-05
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 2023-01-09
    • 1970-01-01
    • 2021-12-04
    相关资源
    最近更新 更多