Spark: как оконная обработка распределяется между исполнителями? - PullRequest
3 голосов
/ 15 октября 2019

У меня есть четкое представление о том, как Spark разбивает данные на разделы внутри исполнителей, затем каждый раздел обрабатывается и затем агрегируется до окончательного «логического» кадра данных.

Однако, используя окна, я чувствую, что данные каждого окнадолжен быть в одном разделе, чтобы каждый исполнитель имел все свои данные локально? Или данные все еще разделяются, а затем агрегируются с помощью какой-то магии?

Пример такого окна:

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

Как Spark справляется с этим? Насколько эффективно использовать Windows?

Что если я обработаю, скажем, 50 столбцов из окна? Может ли это вызвать много сетевых обменов, или каждое окно будет обрабатываться локально?

1 Ответ

0 голосов
/ 16 октября 2019

Для вычисления оконных функций 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.
...