Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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
Apache spark Spark:如何将基于窗口的处理拆分为执行者?_Apache Spark_Apache Spark Sql_Bigdata - Fatal编程技术网

Apache spark Spark:如何将基于窗口的处理拆分为执行者?

Apache spark Spark:如何将基于窗口的处理拆分为执行者?,apache-spark,apache-spark-sql,bigdata,Apache Spark,Apache Spark Sql,Bigdata,我清楚地了解Spark如何将数据拆分到执行器中的分区,然后处理每个分区,然后聚合到最终的“逻辑”数据帧 然而,使用windows时,我觉得每个窗口数据都应该在一个分区中,这样每个执行器的所有数据都在本地?还是数据仍然被分割,然后用一种魔法聚合 此类窗口的一个示例是: val window = Window .partitionBy("partition-col") .orderBy("order-col") .rowsBetween(Window.unboundedPreceding

我清楚地了解Spark如何将数据拆分到执行器中的分区,然后处理每个分区,然后聚合到最终的“逻辑”数据帧

然而,使用windows时,我觉得每个窗口数据都应该在一个分区中,这样每个执行器的所有数据都在本地?还是数据仍然被分割,然后用一种魔法聚合

此类窗口的一个示例是:

val window = Window
  .partitionBy("partition-col")
  .orderBy("order-col")
  .rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing)
myDF.withColumn("sum", sum("aCol").over(window))
Spark是如何处理这个问题的?使用windows的性能如何


如果我处理一个窗口中的50列呢?它会产生大量的网络交换,还是每个窗口都会在本地处理?

要计算窗口函数,Spark需要排列数据,以便将
partitionBy
中提到的列/表达式的值分组到一个分区中-正如您所期望的那样

例如,尝试在窗口跨越整个数据帧的情况下运行函数。您将收到以下警告:

scala> df.withColumn("rn", row_number().over(Window.orderBy(lit(1)))).show
19/10/16 00:08:03 WARN WindowExec: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation.