加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:52:01 所属栏目:安全 来源:网络整理
导读:我用id,app和customer输入如下数据帧 输入数据帧 +--------------------+-----+---------+| id|app |customer |+--------------------+-----+---------+|id1 | fw| WM ||id1 | fw| CS ||id2 | fw| CS ||id1 | fe| WM ||id3 | bc| TR ||id3 | bc| WM |+------
我用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”).pivot(“app”).agg(expr(“coalesce(first(customer),0)”)).drop(“app”).show()

+--------------------+-----+-------+------+
|                  id|bc   |     fe|    fw|
+--------------------+-----+-------+------+
|id1                 |  0  |     WM|    WM|
|id2                 |  0  |      0|    CS|
|id3                 | TR  |      0|     0|
+--------------------+-----+-------+------+

问题:在我的查询中,我无法在“fw”下获得“WM,CS”等“id1”的客户列表(如预期输出中所示),只有“WM”即将到来.类似地,对于“id3”,只出现“TR” – 相反,列表应该在“bc”下为“id3”出现值[TR,WM]

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

解决方法

如果您可以在单元格中使用空列表,则可以使用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]|
+---+--------+----+--------+

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读