2017-09-26 53 views
0

假设我有一个数据帧:获取星火数据帧中的所有列聚集后

+----+----+---+ 
| 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

[代码审查](https://codereview.stackexchange.com/)使工作代码更好 – HyperNeutrino

回答

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;