如何在保持整行的同时获得具有最大值的单行?

How to get a single row with the maximum value while keeping the whole row?

我想为每个 id 获取单行,其中仅存在 charge 列的最大值。

示例输入数据:

id  name charge 
11  hg   10    
11  mm   20
22  aa   40
22  bb   40

我试过的代码:

df.agg(max("charge"))

我只得到最大值,像这样:

charge
40   

但是,我想保留整行:

id  name charge
11  mm   20
22  aa   40
22  bb   40

如何同时保留前两列? name 列对于相同的 id 可以有不同的值,因此不可能在这两个列上使用 groupBy 并聚合结果。

如果两行具有相同的 id 和 charge,则应保留两行。

需要对id列之后的行进行分组,然后在每组中找到charge列的最大值。如果使用 groupBy 来实现此目的,那么 name 列将会消失,如您所见。另一种方法是使用 window 并按 id 进行分区。

要确保在 idcharge 的值相同但 name 不同时保留两行,最好的方法是添加一个新列 maxCharge 然后 filter 数据框。

使用问题中的示例数据框:

val w = Window.partitionBy($"id")
val df2 = df.withColumn("maxCharge", max("charge").over(w))
  .filter($"maxCharge" === $"charge")
  .drop("charge")
  .withColumnRenamed("maxCharge", "charge")

在这里,首先添加一个新列,其中包含每个 id 的最大值。然后删除 charge 值小于此值的行。最后,新列被重命名为 charge 以匹配所需的输出。

最终结果:

+---+----+------+
| id|name|charge|
+---+----+------+
| 22|  aa|    40|
| 22|  bb|    40|
| 11|  mm|    20|
+---+----+------+

第一步应该是按 id 分组并获取 max(charge) 作为新列。 第二步应该是在 input.id=grouped_data.idinput.charge=grouped_data.charge.

上加入输入和分组数据集
input:
id  name charge 
11  hg   10    
11  mm   20
22  aa   40
22  bb   40


grouped_data_on_id:
id  max(charge)
11  20
22  40


joined_data_on_id_and_charge:
id  name charge 
11  hg   10    
22  aa   40
22  bb   40