【问题标题】:pyspark pivot without aggregation没有聚合的pyspark枢轴
【发布时间】:2020-12-03 15:05:19
【问题描述】:

我希望本质上不需要在最后进行聚合以保持数据框完整且不创建分组对象

举个例子:

+---------++---------++---------++---------+
|  country|   code    |Value    | ids
+---------++---------++---------++---------+
| Mexico  |food_1_3   |apple    | 1
| Mexico  |food_1_3   |banana   | 2
| Canada  |beverage_2 |milk     | 1
| Mexico  |beverage_2 |water    | 2
+---------++---------++---------++---------+

需要这个:

+---------++---------++---------++----------+
|  country|    id     |food_1_3 | beverage_2|
+---------++---------++---------++----------+
| Mexico  |    1      |apple      |         |
| Mexico  |    2      |banana     |water    |
| Canada  |    1      |           |milk     |
|+---------++---------++---------++---------+

我试过了

(df.groupby(df.country, df.id).pivot("code").agg(first('Value').alias('Value')))

但基本上只获得前 1 名。在我的真实案例中,我有 20 列,其中一些只有整数,另一些有字符串......所以总和、计数、collect_list 这些 aggs 都没有计算出来......

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql


    【解决方案1】:

    那是因为您的“id”不是唯一的。添加一个唯一的索引列,这应该可以工作:

    import pyspark.sql.functions as F
    
    pivoted = df.groupby(df.country, df.id, F.monotonically_increasing_id().alias('index')).pivot("code").agg(F.first('Value').alias('Value')).drop('index')
    pivoted.show()
    
    +-------+---+----------+--------+
    |country|ids|beverage_2|food_1_3|
    +-------+---+----------+--------+
    | Mexico|  1|      null|   apple|
    | Mexico|  2|     water|    null|
    | Canada|  1|      milk|    null|
    | Mexico|  2|      null|  banana|
    +-------+---+----------+--------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多