gpt4 book ai didi

apache-spark-sql - Spark SQL - 如何避免使用字符串聚合列进行基于排序的聚合

转载 作者:行者123 更新时间:2023-12-03 17:36:15 29 4
gpt4 key购买 nike

我使用 Spark SQL 2.2.0。

执行查询时,例如:

spark.sql("select COL1, min(STRING_COL2) 
from TB1 group by COL1").explain()

Spark 将使用排序聚合,因为 STRING_COL2 是一个字符串列。在大多数情况下,基于排序的聚合比基于哈希的聚合要昂贵得多。

在 GROUP BY 子句中指定字符串列不会强制基于排序的聚合。

如果更换 min(STRING_COL1)sort_array(collect_set(STRING_COL1))[0] ,Spark 将使用比 SortAggregate 好得多的 ObjectHashAggregation(在我的例子中快两倍)。

然而,收集一组不同的值,对其进行排序,最后取第一个值需要更多的内存并消耗更多的 CPU 资源,而不仅仅是比较两个值(如 MIN 应该做的)。此外,如果聚合了许多条目,ObjectHashAggregation 将回退到 SortAggregate。

如何在增加内存消耗的同时避免重排序?
为什么 HashAggregate 不支持字符串列的 MIN 和 MAX?
什么时候会支持?

谢谢。

最佳答案

你可以配置
spark.sql.execution.useObjectHashAggregateExec = true 首先,
从spark 2.2.0开始使用,如果不行,可以在高版本spark上试试。
并检查 string_C1 是否太长;

关于apache-spark-sql - Spark SQL - 如何避免使用字符串聚合列进行基于排序的聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47741297/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com