2017-08-30 22 views
0

我想讓這個變量GroupsByP具有某種類型:GroupsByP是由db連接select/collect語句定義的,它有3個字段:2個字符串(pid)和一個int(order)。spark group by not getting type,mismatch error

預期的結果應該是這樣的形式Map[p,Set[(Id,Order)]]

val GroupsByP = db.pLinkGroups.collect() 
    .groupBy(_.p) 
    .map(group => group._1 -> (group._2.map(_.Id -> group._2.map(_.Order)).toSet)) 

我期望這個變量的類型是

Map[String, Set[(String, Int)]] 

,但實際是Map[String, Set[(String, Array[Int])]],

回答

1

如果我收到了你的問題的權利,這應該做到這一點:

val GroupsByP: Map[String, Set[(String, Int)]] = input.collect() 
    .groupBy(_.p) 
    .map(group => group._1 -> group._2.map(record => (record.Id, record.Order)).toSet) 

您應該將每個記錄映射到一個(Id, Order)元組。

一個非常類似的,但也許更易讀的實現可能是:

val GroupsByP: Map[String, Set[(String, Int)]] = input.collect() 
    .groupBy(_.p) 
    .mapValues(_.map(record => (record.Id, record.Order)).toSet) 
+0

我認爲做的。 QQ你怎麼沒有使用下劃線,而是你使用記錄? – dedpo

+0

使用下劃線作爲這樣的匿名函數的輸入參數,意味着你只能使用那個未命名的參數_once_ - 如果你嘗試使用它兩次(例如'(_.Id,_.Order)'),你實際上正在創建一個匿名函數需要**兩個**參數(第一個下劃線引用第一個下劃線,第二個下劃線引用第二個下劃線)。這顯然不是我們在這裏需要的。換句話說,_naming_參數(在這裏,我將它命名爲「record」 - 可以使用任何有意義的名稱)通常是* must *。 Underscode是一種應該謹慎使用的短手。 –