假设我有一个数据框:
+----+----+---+
| c1|name|qty|
+----+----+---+
|abc1| a| 1|
|abc2| a| 0|
|abc3| b| 3|
|abc4| b| 2|
+----+----+---+
我希望每个qty
只能获得最小name
行:
+----+----+---+
| c1|name|qty|
+----+----+---+
|abc2| a| 0|
|abc4| b| 2|
+----+----+---+
我这样做:
df1 = df.groupBy('name').agg(sf.min('qty')).select("min(qty)")
df2 = df1.join(df, df1["min(qty)"] == df["qty"]).drop("min(qty)") // df2 is the result
它在工作。我想知道它是否可以改进。你怎么能改进上面的解决方案?
答案 0 :(得分:1)
您可以在数据框中使用reduceBuKey。根据名称减少,然后选择下面的键。我假设df与
的数据集相关联case class (c1:String, name:String, qty:Integer)
val mappedPairRdd =
df.map(row ⇒ (row.name, (row.c1, row.name, row.qty))).rdd;
val reduceByKeyRDD = mappedPairRdd
.reduceByKey((row1, row2) ⇒ {
if (row1._3 > row2._3) {
row2
} else {
row1
}
})
.values;