2017-09-26 56 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;