我使用Spark SQL 2.2.0。
执行查询时,例如:
spark.sql("select COL1, min(STRING_COL2)
from TB1 group by COL1").explain()
Spark将使用排序汇总,因为String_col2是字符串列。在大多数情况下,基于排序的聚合比基于哈希的聚合要贵得多。
按子句中的组中指定字符串列不会强制基于排序的聚合。
如果将min(STRING_COL1)
替换为sort_array(collect_set(STRING_COL1))[0]
,Spark将使用Objecthashaggregation,它比SortagGregate好得多(在我的情况下,两次)。
但是,收集一组不同的值,对其进行排序,最后采用第一个值需要更多的内存并消耗更多的CPU资源,而不仅仅是比较两个值(如Min应该这样做)。此外,如果对许多条目进行了汇总,则objecthashaggregation将退缩到sortaggregate。
。随着记忆消耗的增加,如何避免沉重的排序?为什么Hashaggregate不支持字符串列的最低和最大?何时支持?
谢谢。
可能为时已晚,无法回答。无论如何,我从代码中发现的是,只有有限的函数集使用对象哈希,并且列表可以在下面的链接中找到。因此,如果数据类型不可能,则诸如Min和Max之类的功能仍然使用Sort Contregate。其他函数(例如min和max)不从键入的函数等函数等函数等函数等的原因。这样做是因为它们不仅接受表达式不仅仅是列名。
https://jaceklaskowski.gitbooks.io/mastering-spark-sql/content/spark-sql-sql-expression-typedpedpedpedpleppedepperativeaggegeate.html
基于哈希的聚合默认是默认的,但是当GROUP BY
中的键太多时,基于排序的聚合可能会退缩,超过了基于哈希的聚合的缓冲区大小。
请参阅此博客。
您可以配置spark.sql.execution.UseObjectHashagGregateExec = true first,
它使用以来使用Spark 2.2.0,如果它不起作用,则可以在高频Spark中尝试。
和检查String_c1太长