Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在对预分区数据进行分组时,确保Spark作业中的窄依赖性_Scala_Apache Spark_Apache Spark Sql_Spark Dataframe - Fatal编程技术网

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

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确实支持这样的优

我有一个巨大的Spark数据集,包含a、B、C、D、E列。问题是我最初是否在a列上重新分区,然后执行两个“分区内”groupBy操作:

**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]
正如您所看到的,只有一个交换,但有两个散列聚合