【问题标题】:Spark dataframe: Pivot and Group based on columnsSpark数据框:基于列的数据透视和分组
【发布时间】:2018-02-23 23:34:56
【问题描述】:

我输入的数据框如下所示,带有 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|   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”下获得“id1”的 [WM,CS] 等客户列表(如预期输出所示),只有“ WM”来了。类似地,对于“id3”,只有“TR”出现 - 而应该在“id3”的“bc”下出现一个值为 [TR,WM] 的列表

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

【问题讨论】:

    标签: scala hadoop apache-spark spark-dataframe


    【解决方案1】:

    如果您可以在应该为零的单元格处使用空列表,则可以使用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]|
    +---+--------+----+--------+
    

    【讨论】:

      【解决方案2】:

      使用 CONCAT_WS 我们可以分解数组并删除方括号。

      df.groupBy("id").pivot("app").agg(concat_ws(",",collect_list("customer")))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        相关资源
        最近更新 更多