2017-09-26 3 views
0

나는 데이터 프레임있어 가정합니다집계 후 스파크 DataFrame의 모든 열을 얻기

+----+----+---+ 
| c1|name|qty| 
+----+----+---+ 
|abc1| a| 1| 
|abc2| a| 0| 
|abc3| b| 3| 
|abc4| b| 2| 
+----+----+---+ 

내가 모든 name에 대한 최소한의 qty 만 행을 좀하고 싶습니다 :

+----+----+---+ 
| 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를 사용할 수 있습니다. 이름을 기준으로 줄이고 낮은 키를 선택하십시오. I는 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; 
작업 코드는 더 나은 만들기위한
관련 문제