我想为每个只有充电列最大值的id获取单行。
示例输入数据:
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和电荷,则应保留两行。
答案 0 :(得分:4)
必须在id
列之后对行进行分组,然后在每个组中找到charge
列的最大值。如果使用groupBy
来实现此目的,name
列将会消失,正如您所注意到的那样。另一种方法是使用window
并按id
分区。
要确保id
和charge
值相同但name
不同时保留两行,最好的方法是添加新列{{1然后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
答案 1 :(得分:0)
第一步应该是将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