【发布时间】: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|
+----------+------+--+
目标是确定每个人的首选风格。然而,偏好有棘手的规则!
- 如果一个人只有一种风格(例如
P1),那么无论n的观察次数如何,这种风格都是他们的偏好。 - 如果一个人有 2 种或多种风格,其中一种明显具有最大的
n(例如P2风格B),那么这就是偏好。 - 现在变得更难了。如果一个人有 3 种或更多样式,其中至少 2 个
n是最高值且相同,则所有具有最高n的样式都被视为偏好(例如P3样式 @ 987654330@和C) - 如果一个人有 2 种或更多样式,其中
n对所有人都相同,则设置 NO 首选项(例如P4)。请注意,如果P3有一个n样式A(使其成为2),那么它也属于这一类。
在尝试使用 SPARK 之前,我将简单地通过 person 进行 GROUP 和 ORDER 并迭代这些结果,嗅探 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