Spark数据帧:基于列的数据透视表和组

时间:2017-09-14 21:14:25

标签: scala hadoop apache-spark spark-dataframe

我在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"

需要您的建议分别获取每个应用程序下的客户列表。

2 个答案:

答案 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