【问题标题】:Selecting row based on column value in duplicated entries on different column in PySpark根据 PySpark 中不同列的重复条目中的列值选择行
【发布时间】:2016-06-23 19:34:26
【问题描述】:

我有一个 PySpark DataFrame,我将它分组在一个字段(列)上,目的是消除每个组的记录,这些记录具有另一个字段的特定值。 例如,表格看起来像

colA    colB
'a'     1
'b'     1
'a'     0
'c'     0

这里我想要删除有重复 colA 和 colB 为 0 的记录,以便获得

colA    colB
'a'     1
'b'     1
'c'     0

'c' 的行仍然存在,因为我只想删除重复(在 colA 上)行的 0。

我想不出一种方法来实现这一点,因为如果expr 不是“avg”、“max”之一,我不精通在groupBy 之后使用agg 的方法等。

【问题讨论】:

    标签: python sql apache-spark aggregate pyspark


    【解决方案1】:

    简单的max怎么样?

    from pyspark.sql.functions import max as max_
    
    df = sc.parallelize([
      ('a', 1), ('b', 1), ('a', 0), ('c', 0)
    ]).toDF(('colA', 'colB'))
    
    df.groupBy('colA').agg(max_('colB')).show()
    ## +----+---------+
    ## |colA|max(colB)|
    ## +----+---------+
    ## |   a|        1|
    ## |   b|        1|
    ## |   c|        0|
    ## +----+---------+
    

    这种方法适用于任何支持排序并使用二进制标签的列,并且可以对您使用的聚合函数进行可选调整 (min / max)。

    使用窗口函数可以实现更高级的规则,但成本会更高。

    这里有一个例子:

    from pyspark.sql.functions import col, sum as sum_, when
    from pyspark.sql import Window
    import sys
    
    w = Window.partitionBy("colA").rowsBetween(-sys.maxsize, sys.maxsize)
    
    this_non_zero = col("colB") != 0
    any_non_zero = sum_(this_non_zero.cast("long")).over(w) != 0
    
    (df
      .withColumn("this_non_zero", this_non_zero)
       .withColumn("any_non_zero", any_non_zero)
       .where(
           (col("this_non_zero") & col("any_non_zero")) | 
           ~col("any_non_zero")
       ))
    

    【讨论】:

    • 您还可以查看stackoverflow.com/q/35218882/1560062stackoverflow.com/q/33878370/1560062 了解其他一些想法。但在这里我不会打扰。
    • 不要 :) max / min 应该直接工作,但如果你想明确使用 when(col("colA") == "foo", 0).otherwise(1) 之类的东西
    • 这太棒了!我可以问一下 max 和 min 究竟是如何工作的,它们是否计算字符串长度的最大/最小值?使用 max 我得到最短的字符串 a,min 最长(想想在你的例子中 1 和 0 变成“已保存”和“隐藏”:max 得到“保存”,min 得到“隐藏”,所以我'我很困惑)。
    • 假设没有大小写混合的字符串和本地化的字符串,它只会按字母顺序排列。所以h 出现在s 之前:)
    猜你喜欢
    • 2017-06-17
    • 1970-01-01
    • 2022-11-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多