2017-03-09 230 views
0

val df = sc.parallelize(Seq((a, 1), (a, null), (b, null)(b, 2),(b, 3),(c, 2),(c, 4),(c, 3))).toDF("col1","col2")火花數據幀聚合階

輸出應該是這樣的下方。 col1 col2 a null b null c 4 我知道col在col1上獲得col2的最大值。我可以使用df.groupBy("col1").agg("col2"->"max")

但我的要求是,如果空有我想選擇該記錄,但如果null不存在,我想選擇col2的最大值。

我該如何做到這一點,任何請幫助我。

+0

嘗試使用此 '進口org.apache.spark.sql.functions._' 'df.groupBy( 「COL1」)。AGG(collect_as_list( 「COL2」))'現在你有COL2名單試試這裏的邏輯,如果list.contains(null)返回null否則從列表中的最大值 –

+0

你應該真的重新考慮問題的前提。 RDD中不需要有一堆'null'。 – Vidya

+0

大家好,謝謝你的回覆。我以下面的方式完成了這項工作。我首先通過將null值更新爲該列的字符串'99 -99-9999'來修改數據框。然後我在其他列上做了一個組,並在我更新的列上使用了agg - > max。所以我的要求得到滿足。非常感謝所有迴應的人。 – Ramesh

回答

0

正如我評論,你的null使用使事情不必要的問題,所以如果你能不null擺在首位不行,我覺得最有意義把它變成更有用的東西:

val df = sparkContext.parallelize(Seq((a, 1), (a, null), (b, null), (b, 2),(b, 3),(c, 2),(c, 4),(c, 3))) 
     .mapValues { v => Option(v) match { 
      case Some(i: Int) => i 
      case _ => Int.MaxValue 
      } 
     }.groupBy(_._1).map { 
      case (k, v) => k -> v.map(_._2).max 
     } 

首先,我用Option擺脫null,並將東西從Any下移到Int,這樣我就可以享受更多的類型安全。我將用MaxValue代替null,原因我馬上解釋。

然後我groupBy像你一樣,後來我map在組與值的最大值,這要麼是你原來的數據項的一個或MaxValue其中null一度是配對的鑰匙。如果你必須,你可以把它們變回null,但我不會。

有可能是做這一切更簡單的方法,但我喜歡null替換MaxValue,模式匹配,這有助於我縮小類型,而事實上我可以把一切都同算賬。