Scala 在对预分区数据进行分组时,确保Spark作业中的窄依赖性
我有一个巨大的Spark数据集,包含a、B、C、D、E列。问题是我最初是否在a列上重新分区,然后执行两个“分区内”groupBy操作:Scala 在对预分区数据进行分组时,确保Spark作业中的窄依赖性,scala,apache-spark,apache-spark-sql,spark-dataframe,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列规范中?如果没有,我可以做些什么来确保整个操作链中的狭窄依赖关系?Spark确实支持这样的优
**groupBy("A", "C")**....map(....).**groupBy("A", "E")**....map(....)
Spark 2.0是否足够聪明,可以旁路洗牌,因为两个groupBy操作都在父阶段的“分区内”——即A列包含在两个groupBy列规范中?如果没有,我可以做些什么来确保整个操作链中的狭窄依赖关系?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]
正如您所看到的,只有一个交换,但有两个散列聚合