SPARK SQL-如何避免使用字符串聚合列的基于排序的聚集



我使用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太长

相关内容

  • 没有找到相关文章

最新更新