我有一个巨大的Spark数据集,其中包含A,B,C,D,E列。问题是,如果我最初在A列上重新分区,然后在分区内进行两次' groupBy操作:
**groupBy("A", "C")**....map(....).**groupBy("A", "E")**....map(....)
Spark 2.0非常聪明,可以绕过混乱,因为groupBy操作都是在分区内进行的。关于父级 - 即A列是否包含在groupBy列规范中?如果没有,我该怎么做才能确保整个操作链中的依赖性很小?
答案 0 :(得分:0)
Spark确实支持这样的优化。您可以通过分析执行计划来检查:
val df = Seq(("a", 1, 2)).toDF("a", "b", "c")
df.groupBy("a").max().groupBy("a", "max(b)").sum().explain
== Physical Plan ==
*HashAggregate(keys=[a#42, max(b)#92], functions=[sum(cast(max(b)#92 as bigint)), sum(cast(max(c)#93 as bigint))])
+- *HashAggregate(keys=[a#42, max(b)#92], functions=[partial_sum(cast(max(b)#92 as bigint)), partial_sum(cast(max(c)#93 as bigint))])
+- *HashAggregate(keys=[a#42], functions=[max(b#43), max(c#44)])
+- Exchange hashpartitioning(a#42, 200)
+- *HashAggregate(keys=[a#42], functions=[partial_max(b#43), partial_max(c#44)])
+- LocalTableScan [a#42, b#43, c#44]
正如您所看到的,只有一个交换,但有两个哈希聚合。