事件数据的 Delta Lake 分区策略

Delta Lake partitioning strategy for event data

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

主要用例是检索应用中发生的用户操作事件。 此事件数据的批次将大约每 5-30 分钟登陆一次 S3 存储桶,Databricks Auto Loader 将拾取它们并将其存储在 Delta Table.

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

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

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

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

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

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