在PYSPARKSQL中转动

时间:2017-12-28 11:44:21

标签: sql apache-spark pyspark apache-spark-sql pyspark-sql

我需要在下表中使用pivot。

id,week,score
102,1,96
101,1,138
102,1,37
101,1,59
101,2,282
102,2,212
102,2,78
101,2,97
102,3,60
102,3,123
101,3,220
101,3,87

输出

      1         2         3

101   138,59   282,97     220,87
102   96,37    212,78     123,60

这里我需要排序分数

我尝试了以下代码,但只有在特定ID上有一条记录时才能使用

df.groupBy("id").pivot("week").agg(first("score"))

2 个答案:

答案 0 :(得分:3)

您应该使用first收集所有值,而不是collect_list,这将为您提供列表中的结果

import org.apache.spark.sql.functions._

df.groupBy("id").pivot("week").agg(collect_list("score")).show()

输出:

+---+---------+---------+---------+
|id |1        |2        |3        |
+---+---------+---------+---------+
|101|[138, 59]|[282, 97]|[220, 87]|
|102|[96, 37] |[212, 78]|[60, 123]|
+---+---------+---------+---------+

答案 1 :(得分:1)

prasad Khode发布的 scala 答案的pyspark的等效 python 代码如下所示

from pyspark.sql import functions as F
df.groupBy("id").pivot("week").agg(F.collect_list("score")).show()

如果你查看api文件,你可以看到

  

collect_list(第e栏)
  聚合函数:返回带有重复项的对象列表。

您也可以使用collect_set,这会为您提供相同的输出,并删除重复项。

df.groupBy("id").pivot("week").agg(F.collect_set("score")).show()

api文件说明如下

  

collect_set(第e栏)
  聚合函数:返回一组消除了重复元素的对象。