Apache spark Spark:如何将基于窗口的处理拆分为执行者?
我清楚地了解Spark如何将数据拆分到执行器中的分区,然后处理每个分区,然后聚合到最终的“逻辑”数据帧 然而,使用windows时,我觉得每个窗口数据都应该在一个分区中,这样每个执行器的所有数据都在本地?还是数据仍然被分割,然后用一种魔法聚合 此类窗口的一个示例是: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
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.