在 Azure Databricks 上聚合数据

本文介绍聚合的一般语义,并讨论使用批处理查询、具体化视图和流式处理计算的结果之间的差异。

批处理聚合

批处理聚合是在 SQL 中运行临时查询或使用 Apache Spark DataFrames 处理数据时观察到的默认行为。

针对表或数据源编写的聚合查询会计算数据源中所有记录的聚合统计信息。 Azure Databricks 会尽可能利用优化和元数据来优化这些查询,并且可以为大型数据集计算许多聚合。

随着数据大小的增加,批处理聚合的延迟和计算成本可能会增加,而预计算频繁引用的聚合值可以节省用户大量的时间和金钱。 Databricks 建议使用具体化视图以增量方式更新聚合值。 请参阅增量聚合

有状态聚合

流式处理工作负载中定义的聚合是有状态的。 有状态聚合会跟踪一段时间内观察到的记录,并在处理新数据时重新计算结果。

计算有状态聚合时,必须使用水印。 省略有状态聚合查询中的水印会导致状态信息在一段时间内无限地累积。 这会导致处理速度变慢,并可能导致内存不足错误。

不应使用有状态聚合来计算整个数据集的统计信息。 Databricks 建议对整个数据集使用具体化视图进行增量聚合计算。 请参阅增量聚合

若要配置有效且正确地计算有状态聚合的工作负载,需要了解数据如何从源系统到达,以及 Azure Databricks 如何使用水印、输出模式和触发间隔来控制查询状态和结果计算。

增量聚合

可以使用具体化视图以增量方式计算许多聚合值。 具体化视图会自动跟踪数据源中的更改,并在刷新时将相应的更新应用于聚合值。 具体化视图返回的结果等效于使用批处理作业或即席查询重新计算源数据上的聚合结果所返回的结果。

近似聚合

虽然 Azure Databricks 擅长计算非常大的数据集,但对聚合使用近似法可以加速查询处理,并在不需要精确结果时降低成本。

使用 LIMIT 语句有时足以快速获取数据的快照,但不会引入随机性,或保证采样在数据集分布。

Spark SQL 具有以下本机方法,用于对数值或分类数据进行近似聚合:

还可以使用 TABLESAMPLE 指定一个样本百分比,以便从数据集生成随机样本并计算近似聚合。 请参阅 TABLESAMPLE 子句

使用聚合统计信息监视数据集

Lakehouse 监视使用聚合统计信息和数据分布来跟踪一段时间内的数据质量。 可以生成报告来可视化趋势并安排警报以标记数据中的意外更改。