【问题标题】:Spark: how is a window-based processing splitted to executors?Spark:如何将基于窗口的处理拆分为执行程序?
【发布时间】:2020-02-12 06:01:02
【问题描述】:

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

但是使用windows,我觉得每个window数据应该在一个分区中,这样每个executor的数据都在本地?还是数据仍然被拆分,然后用某种魔法聚合?

这种窗口的一个例子是:

val window = Window
  .partitionBy("partition-col")
  .orderBy("order-col")
  .rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing)
myDF.withColumn("sum", sum("aCol").over(window))

Spark 如何处理这个问题?使用 windows 性能如何?

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

【问题讨论】:

    标签: apache-spark apache-spark-sql bigdata


    【解决方案1】:

    要计算窗口函数,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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      相关资源
      最近更新 更多