我在id,app和customer
中输入了如下数据框输入数据框
+--------------------+-----+---------+
| id|app |customer |
+--------------------+-----+---------+
|id1 | fw| WM |
|id1 | fw| CS |
|id2 | fw| CS |
|id1 | fe| WM |
|id3 | bc| TR |
|id3 | bc| WM |
+--------------------+-----+---------+
预期输出
使用pivot和aggregate - 将app值设为列名,并将聚合的客户名称作为列表添加到数据框中
预期的数据框
+--------------------+----------+-------+----------+
| id| bc | fe| fw |
+--------------------+----------+-------+----------+
|id1 | 0 | WM| [WM,CS]|
|id2 | 0 | 0| [CS] |
|id3 | [TR,WM] | 0| 0 |
+--------------------+----------+-------+----------+
我尝试了什么?
val newDF = df.groupBy(" ID&#34)枢转。("应用&#34)AGG。(表达式("聚结(第一(客户),0)&#34))。降("应用&#34)。显示()
+--------------------+-----+-------+------+
| id|bc | fe| fw|
+--------------------+-----+-------+------+
|id1 | 0 | WM| WM|
|id2 | 0 | 0| CS|
|id3 | TR | 0| 0|
+--------------------+-----+-------+------+
问题:在我的查询中,我无法获得像[WM,CS]这样的客户列表" id1"在" fw" (如预期输出所示),仅" WM"来了。同样,对于" id3"只有" TR"正在出现 - 相反,列表应显示值为[TR,WM]" bc" for" id3"
需要您的建议分别获取每个应用程序下的客户列表。
答案 0 :(得分:4)
如果你可以在一个空的列表中使用collect_list
,那么你可以使用df.groupBy("id").pivot("app").agg(collect_list("customer")).show
+---+--------+----+--------+
| id| bc| fe| fw|
+---+--------+----+--------+
|id3|[TR, WM]| []| []|
|id1| []|[WM]|[CS, WM]|
|id2| []| []| [CS]|
+---+--------+----+--------+
:
{{1}}
答案 1 :(得分:4)
使用CONCAT_WS我们可以爆炸数组并删除方括号。
render