在对预分区数据进行分组时,确保Spark作业的依赖性较小

时间:2017-04-10 14:06:51

标签: scala apache-spark apache-spark-sql spark-dataframe

我有一个巨大的Spark数据集,其中包含A,B,C,D,E列。问题是,如果我最初在A列上重新分区,然后在分区内进行两次' groupBy操作:

**groupBy("A", "C")**....map(....).**groupBy("A", "E")**....map(....)

Spark 2.0非常聪明,可以绕过混乱,因为groupBy操作都是在分区内进行的。关于父级 - 即A列是否包含在groupBy列规范中?如果没有,我该怎么做才能确保整个操作链中的依赖性很小?

1 个答案:

答案 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]

正如您所看到的,只有一个交换,但有两个哈希聚合。