Spark: Есть ли различия между функцией agg и оконной функцией в кадре данных spark? - PullRequest
0 голосов
/ 03 апреля 2019

Я хочу применить сумму к столбцу в Spark Dataframe (Spark 2.1), у меня есть два способа сделать это:

1 - с помощью функции Window:

val windowing = Window.partitionBy("id")
dataframe
.withColumn("sum", sum(col("column_1")) over windowing)

2- С функцией agg:

dataframe
.groupBy("id")
.agg(sum(col("column_1")).alias("sum"))

Каков наилучший способ сделать это с точки зрения производительности?И в чем разница между этими двумя методами?

1 Ответ

2 голосов
/ 03 апреля 2019

Вы можете использовать функции агрегирования как внутри окна (ваш первый случай), так и при группировании (ваш второй случай). Разница в том, что с окном каждая строка будет связана с результатом агрегации, вычисленной для всего окна. Однако при группировании каждая группа будет связана с результатом агрегирования в этой группе (группа строк становится только одной строкой).

В вашей ситуации вы бы получили это.

val dataframe = spark.range(6).withColumn("key", 'id % 2)
dataframe.show
+---+---+
| id|key|
+---+---+
|  0|  0|
|  1|  1|
|  2|  0|
|  3|  1|
|  4|  0|
|  5|  1|
+---+---+

Случай 1: оконное дело

val windowing = Window.partitionBy("key")
dataframe.withColumn("sum", sum(col("id")) over windowing).show
+---+---+---+                                                                   
| id|key|sum|
+---+---+---+
|  0|  0|  6|
|  2|  0|  6|
|  4|  0|  6|
|  1|  1|  9|
|  3|  1|  9|
|  5|  1|  9|
+---+---+---+

Случай 2: группировка

dataframe.groupBy("key").agg(sum('id)).show
+---+-------+
|key|sum(id)|
+---+-------+
|  0|      6|
|  1|      9|
+---+-------+
...