事件数据的 Delta Lake 分区策略

问题描述

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

主要用例是检索应用中发生的用户操作事件。 大约每 5 到 30 分钟,此事件数据的批次将进入 S3 存储桶,Databricks 自动加载程序会将它们提取并存储在 Delta 表中。

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

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

#!/usr/bin/env python3

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

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

解决方法

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