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

时间:2018-01-31 02:39:38

标签: scala apache-spark apache-spark-sql spark-dataframe

我想为每个只有充电列最大值的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和电荷,则应保留两行。

2 个答案:

答案 0 :(得分:4)

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

要确保idcharge值相同但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.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