Scala Spark dataframe:基于列的透视和分组

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、应用程序和客户

输入数据帧

+--------------------+-----+---------+
|                  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")))