【问题标题】:Pyspark SQL get ALL highest values from group and assess for dupesPyspark SQL 从组中获取所有最高值并评估是否有欺骗性
【发布时间】:2021-03-16 22:19:05
【问题描述】:

考虑这个数据框:

+----------+------+--+
|    person| style| n|
+----------+------+--+
|        P1|     A| 1|
|        P2|     A| 1|
|        P2|     B| 2|
|        P3|     A| 1|
|        P3|     B| 2|
|        P3|     C| 2|
|        P4|     A| 2|
|        P4|     B| 2|
+----------+------+--+

目标是确定每个人的首选风格。然而,偏好有棘手的规则!

  1. 如果一个人只有一种风格(例如P1),那么无论n 的观察次数如何,这种风格都是他们的偏好。
  2. 如果一个人有 2 种或多种风格,其中一种明显具有最大的 n(例如 P2 风格 B),那么这就是偏好。
  3. 现在变得更难了。如果一个人有 3 种或更多样式,其中至少 2 个 n 是最高值且相同,则所有具有最高 n 的样式都被视为偏好(例如 P3 样式 @ 987654330@和C)
  4. 如果一个人有 2 种或更多样式,其中 n 对所有人都相同,则设置 NO 首选项(例如 P4)。请注意,如果P3 有一个n 样式A(使其成为2),那么它也属于这一类。

在尝试使用 SPARK 之前,我将简单地通过 person 进行 GROUPORDER 并迭代这些结果,嗅探 max(n) 并通常以编程方式处理它。但我是 SPARK 的新手,我知道应该避免迭代和收集等。我认为我的目标输出帧是

+----------+------+--+
|    person| style| n|
+----------+------+--+
|        P1|     A| 1|
|        P2|     B| 2|
|        P3|     B| 2|
|        P3|     C| 2|
+----------+------+--+

有几个很好的例子可以在 GROUP BY 的列中找到 最高 值,但这不满足上面的规则 #3 或 #4。

我猜是(count(max(n)) <> count(*)) or count(max(n)) = 1 的某种自联接,但我不是 SQL 专家。

不是为了让这成为一场比赛,而是作为比较,在 MongoDB 中,我会为每个人获取样式和计数到一个 array 中,然后使用 $reduce 遍历数组并应用逻辑来查看如果n 在每种样式中都相同,则使用指示状态的代码“标记”文档(而不是数组)。

【问题讨论】:

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


    【解决方案1】:

    您可以使用条件 4 标记行并在执行通常的 row_number 技巧后将其删除(实际上这里是 rank,因为您想根据条件 3 保持联系):

    from pyspark.sql import functions as F, Window
    
    df2 = df.withColumn(
        'cond', 
        (F.count('*').over(Window.partitionBy('person')) > 1) & 
        (F.min('n').over(Window.partitionBy('person')) == 
         F.max('n').over(Window.partitionBy('person'))
        )
    ).withColumn(
        'rn', 
        F.rank().over(Window.partitionBy('person').orderBy(F.desc('n')))
    ).filter('rn = 1 and not cond').drop('cond', 'rn')
    
    df2.show()
    +------+-----+---+
    |person|style|  n|
    +------+-----+---+
    |    P2|    B|  2|
    |    P3|    B|  2|
    |    P3|    C|  2|
    |    P1|    A|  1|
    +------+-----+---+
    

    【讨论】:

      猜你喜欢
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多