【问题标题】:pyspark dataframe join all keys to collect_list() valuespyspark 数据框将所有键连接到 collect_list() 值
【发布时间】:2018-01-31 07:09:52
【问题描述】:

我有一个 pyspark 数据框,其中包含表单的键和值列表:

    k1,v1
    k2,v2
    k3,v3

我想创建:

    k1,[v1,v2,v3]
    k2,[v1,v2,v3]
    k3,[v1,v2,v3]

因为我发现k1=k2=k3。我知道这将涉及 collect_list() 但我仍然不确定如何获得所需的输出。

任何帮助都会很棒!

【问题讨论】:

    标签: python apache-spark pyspark pyspark-sql


    【解决方案1】:

    您可以执行以下操作

    from pyspark.sql import Window
    windowSpec = Window.orderBy("col1").rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing)
    
    from pyspark.sql import functions as F
    df.withColumn("col2", F.collect_list("col2").over(windowSpec)).show(false)
    

    【讨论】:

    • Ramesh,这里为什么要用window?
    • 将整个数据框表示为一个窗口,并使用所使用的聚合函数更新每一行。 @RakeshKumar
    • 您可以通过 groupby("col1").agg(F.collect_list("col2")).show() 来实现,它将提供所需的汇总结果。
    • 我不这么认为。你试过了吗?
    • 它将提供所需的汇总结果,而不是更新所有行。
    【解决方案2】:

    你可以试试这个,collect list会收集k1k2对应的所有值是否可以重复多次。

    我们可以这样做:- from pyspark.sql 导入函数为 F

    n = sqlContext.createDataFrame([
            ["k1", "v1"], 
            ["k1", "v2"], 
            ["k1", "v3"], 
            ["k1", "v1"], 
            ["k2", "v1"], 
            ["k2", "v2"], 
            ["k2", "v3"], 
            ["k2", "v1"], 
        ], ["col1", "col2"])
    n.show()
    +----+----+
    |col1|col2|
    +----+----+
    |  k1|  v1|
    |  k1|  v2|
    |  k1|  v3|
    |  k1|  v1|
    |  k2|  v1|
    |  k2|  v2|
    |  k2|  v3|
    |  k2|  v1|
    +----+----+
    n.groupby("col1").agg(F.collect_list("col2")).show()
    
    +----+------------------+
    |col1|collect_list(col2)|
    +----+------------------+
    |  k1|  [v1, v2, v3, v1]|
    |  k2|  [v1, v2, v3, v1]|
    +----+------------------+
    

    如果需要删除重复项:-

    n.groupby("col1").agg(F.collect_set("col2")).show()
    +----+-----------------+
    |col1|collect_set(col2)|
    +----+-----------------+
    |  k1|     [v1, v2, v3]|
    |  k2|     [v1, v2, v3]|
    +----+-----------------+
    

    【讨论】:

    • 查看您的输入数据框和 OP 输入数据框。它们是一样的吗?
    • 是输入的聚合结果,即。有问题需要。如果您想使用 collect_list 值在输入中实现第三列,那么您可以同时加入输入和输出。如果你也需要这个,我可以修改我的答案。
    【解决方案3】:

    使用@Rakesh dataframe n,您可以通过聚合收集创建dataframe m

    m = n.groupby("col1").agg(F.collect_set("col2").cast('string').alias('set'))
    
    m.show()
    

    输出:

    +----+----------+
    |col1|       set|
    +----+----------+
    |  k2|[v2,v3,v1]|
    |  k1|[v2,v3,v1]|
    +----+----------+
    

    并将它们连接起来:

    m.select(F.concat(m.col1, F.lit(','), m.set).alias('concatenated')).show()
    

    输出:

    +-------------+
    | concatenated|
    +-------------+
    |k2,[v2,v3,v1]|
    |k1,[v2,v3,v1]|
    +-------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2020-01-08
      • 1970-01-01
      相关资源
      最近更新 更多