【问题标题】:Filter on dynamic unique combinations of columns in Pyspark过滤 Pyspark 中列的动态唯一组合
【发布时间】:2020-08-23 07:25:49
【问题描述】:

我将 df1 作为原始数据框,df2 具有 A 和 B 的唯一组合,结果是每个唯一组合的 Amount col 的平均值。见下文:

df1 -> df2

Combination = df1.crosstab("A", "B") 现在可以使用 df2 中当前的值应用过滤器,但挑战在于 df2 可以随着 df1 随时间变化而动态变化。因此,无法手动修复过滤器。 (如下图)

Result = df1.withColumn("Avg", when(col("A")=="AI3 & col("B")=="AI5), avg(col("Amount"))
………...

需要读取和映射 df2 组合以有效过滤和获取结果。

【问题讨论】:

    标签: dataframe pyspark apache-spark-sql


    【解决方案1】:

    如果要保留第一个数据帧,请使用Window

    import pyspark.sql.functions as f
    from pyspark.sql import Window
    
    w = Window.partitionBy('A', 'B')
    
    df.withColumn('avg', f.avg('Amount').over(w)).show()
    
    +---+---+------+----+
    |  A|  B|Amount| avg|
    +---+---+------+----+
    |AI8|AI5|    75|50.0|
    |AI8|AI5|    25|50.0|
    |AI3|AI5|    20|20.0|
    |AI3|AI5|    30|20.0|
    |AI3|AI5|    10|20.0|
    |AI5|AI3|    80|80.0|
    +---+---+------+----+
    

    我不明白你为什么需要数据框df2。只需按df1 分组并获得每个AB 的平均值,这就是您想要的。那些列的 Group by 已经实现了不同的列组合。

    df.groupBy('A', 'B').avg('Amount').show()
    
    +---+---+-----------+
    |  A|  B|avg(Amount)|
    +---+---+-----------+
    |AI8|AI5|       50.0|
    |AI3|AI5|       20.0|
    |AI5|AI3|       80.0|
    +---+---+-----------+
    

    【讨论】:

    • 对不起,我要找的结果是 df1+Avg 列,所以可能是df1.join(df.groupBy('A', 'B').avg('Amount'), 'left')。将编辑问题。谢谢。
    • 那你最好使用Window。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多