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

Ehu*_*het 6 apache-spark-sql

我使用 Spark SQL 2.2.0。

执行查询时,例如:

spark.sql("select COL1, min(STRING_COL2) 
           from TB1 group by COL1").explain()
Run Code Online (Sandbox Code Playgroud)

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

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

如果替换min(STRING_COL1)sort_array(collect_set(STRING_COL1))[0],Spark 将使用 ObjectHashAggregation,它比 SortAggregate 好得多(在我的情况下快两倍)。

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

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

谢谢。

che*_*mos 0

您可以首先配置\nspark.sql.execution.useObjectHashAggregateExec = true\xef\xbc\x8c

\n

从spark 2.2.0\xef\xbc\x8c开始使用,如果不起作用,可以在高版本spark中尝试。

\n

并检查 string_C1 是否太长\xef\xbc\x9b

\n