如何在Spark sql中根据条件选择不同的行

jjhzyzn0  于 2023-06-30  发布在  Apache
关注(0)|答案(1)|浏览(170)

我创建了一个基于num列的排名列,并按名称分组。我正在尝试实现逻辑select the colour value in the first row if num is not 0, otherwise use the colour value from the second row or 3rd row, where the num is not 0例如,对于名称A,应选择黄色。对于名称B,应选择绿色。有没有人可以帮助建议如何做到这一点?谢谢你。

Name.    colour     num.     rank 
 A.       blue       0         1
 A        yellow.    300       2
 B        green      100.      1
 B        brown      500.      2
lxkprmvk

lxkprmvk1#

你可以先使用filter来排除0,然后使用Window partition来分配row_number,然后再使用filter来过滤掉不是1的值。
Example

df
  .filter(col("num").gt(0))
  .withColumn("row_number", row_number().over(Window.partitionBy("name").orderBy(col("rank"))))
  .filter(col("row_number").equalTo(1))
  .drop("row_number")

Output

+----+------+---+----+
|name|color |num|rank|
+----+------+---+----+
|A   |yellow|300|2   |
|B   |green |100|1   |
+----+------+---+----+

这仅在namenum的组合是唯一的假设下起作用,如果不是这种情况,则需要进一步调整。此外,如果您显示导致您提到的表的代码,这个问题可以以更有效的方式解决(可能)。祝你好运!

相关问题