如何在保持整行的同时获得具有最大值的单行?
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
进行分区。
要确保在 id
和 charge
的值相同但 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.id
和 input.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
我想为每个 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
进行分区。
要确保在 id
和 charge
的值相同但 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.id
和 input.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