Scala Spark dataframe:基于列的透视和分组
我已经输入了数据框,如下面的id、应用程序和客户 输入数据帧Scala Spark dataframe:基于列的透视和分组,scala,hadoop,apache-spark,spark-dataframe,Scala,Hadoop,Apache Spark,Spark Dataframe,我已经输入了数据框,如下面的id、应用程序和客户 输入数据帧 +--------------------+-----+---------+ | id|app |customer | +--------------------+-----+---------+ |id1 | fw| WM | |id1 | fw| CS | |id2 |
+--------------------+-----+---------+
| id|app |customer |
+--------------------+-----+---------+
|id1 | fw| WM |
|id1 | fw| CS |
|id2 | fw| CS |
|id1 | fe| WM |
|id3 | bc| TR |
|id3 | bc| WM |
+--------------------+-----+---------+
+--------------------+----------+-------+----------+
| id| bc | fe| fw |
+--------------------+----------+-------+----------+
|id1 | 0 | WM| [WM,CS]|
|id2 | 0 | 0| [CS] |
|id3 | [TR,WM] | 0| 0 |
+--------------------+----------+-------+----------+
预期产出
使用pivot和aggregate-将应用程序值作为列名,并将聚合的客户名称作为列表放入数据框中
预期数据帧
+--------------------+-----+---------+
| id|app |customer |
+--------------------+-----+---------+
|id1 | fw| WM |
|id1 | fw| CS |
|id2 | fw| CS |
|id1 | fe| WM |
|id3 | bc| TR |
|id3 | bc| WM |
+--------------------+-----+---------+
+--------------------+----------+-------+----------+
| id| bc | fe| fw |
+--------------------+----------+-------+----------+
|id1 | 0 | WM| [WM,CS]|
|id2 | 0 | 0| [CS] |
|id3 | [TR,WM] | 0| 0 |
+--------------------+----------+-------+----------+
我试过什么?
瓦尔·纽德夫=
df.groupBy(“id”).pivot(“app”).agg(expr(“coalesce(first(customer),0)”).drop(“app”).show()
问题:在我的查询中,我无法在“fw”(如预期输出所示)下获得“id1”中类似[WM,CS]的客户列表,只有“WM”出现。类似地,对于“id3”,只有“TR”出现,而应该在“id3”的“bc”下出现一个值为[TR,WM]的列表
需要您的建议,以分别获取每个应用程序下的客户列表。如果您可以在单元格中保留空列表,则可以使用
收集列表
:
df.groupBy("id").pivot("app").agg(collect_list("customer")).show
+---+--------+----+--------+
| id| bc| fe| fw|
+---+--------+----+--------+
|id3|[TR, WM]| []| []|
|id1| []|[WM]|[CS, WM]|
|id2| []| []| [CS]|
+---+--------+----+--------+
使用CONCAT_WS,我们可以分解数组并删除方括号
df.groupBy("id").pivot("app").agg(concat_ws(",",collect_list("customer")))