【问题标题】:Collect rows to columns in Scala Spark using partitionBy使用 partitionBy 将行收集到 Scala Spark 中的列
【发布时间】:2021-09-17 02:26:40
【问题描述】:

我有一个问题。假设我有这样的数据:

name | surname | info | groupId
-------------------------------
John | Silver  | 123  | 1 
-------------------------------
Mary | Silver  | 144  | 2
------------------------------
Qwer | Tyyyyy  | 255  | 1

我想这样得到它:

name | surname | info | name-2  | surname-2 | info-2 | groupId 
------------------------------- |-------------------------------------
John | Silver  | 123  | Qwer    | Tyyyyy    | 255    | 1
------------------------------- |-------------------------------------
Mary | Silver  | 144  | null    | null      | null   | 2

我认为这是 Window.partitionBy("groupId") 的问题,然后我想将分区中的所有行作为列。请帮忙

【问题讨论】:

    标签: scala apache-spark window-functions partitioning


    【解决方案1】:

    这对您来说可能是一个可行的解决方案 使用 first()groupBy() 以及 row_number()

    df = spark.createDataFrame([("john","silver",123,1),("Mary","Silver",144,2),("Qwer","Tyyy",255,1)],["name","surname","info","groupId"])
    df.show()
    _w = W.partitionBy("groupId").orderBy(F.col("info").desc())
    
    
    df = df.withColumn("rnk", F.row_number().over(_w))
    df_grp = df.groupBy("groupId").pivot("rnk").agg(F.first("surname").alias("surname"), F.first("info").alias("info"),F.first("name").alias("name"))
    display(df_grp)
    
    +----+-------+----+-------+
    |name|surname|info|groupId|
    +----+-------+----+-------+
    |john| silver| 123|      1|
    |Mary| Silver| 144|      2|
    |Qwer|   Tyyy| 255|      1|
    +----+-------+----+-------+
    
       +-------+---------+------+------+---------+------+------+
    |groupId|1_surname|1_info|1_name|2_surname|2_info|2_name|
    +-------+---------+------+------+---------+------+------+
    |      1|     Tyyy|   255|  Qwer|   silver|   123|  john|
    |      2|   Silver|   144|  Mary|     null|  null|  null|
    +-------+---------+------+------+---------+------+------+
    

    【讨论】:

    • 抱歉,我不得不提一下,partitionBy 之后可以有两行以上,所以看起来“first”和“last”不会做这件事:(如果有的话,你的解决方案会复制行分区后只有一个。我希望有空值或一些默认值。
    • 或者如果知道不能超过5行有没有办法?
    • 好的.. 我已经更新了我的答案 - 如果这对你有帮助,请告诉我 - 如果你能接受并投票,不胜感激
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 2020-08-11
    • 2019-04-01
    相关资源
    最近更新 更多