我使用 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?什么时候会支持?
谢谢。
您可以首先配置\nspark.sql.execution.useObjectHashAggregateExec = true\xef\xbc\x8c
\n从spark 2.2.0\xef\xbc\x8c开始使用,如果不起作用,可以在高版本spark中尝试。
\n并检查 string_C1 是否太长\xef\xbc\x9b
\n| 归档时间: |
|
| 查看次数: |
3265 次 |
| 最近记录: |