2017-01-10 194 views
2

如何組由不同的值具有在一個文件中的以下格式的數據:火花:我在數據幀

1,32  
1,33 
1,44 
2,21 
2,56 
1,23 

我執行的代碼如下:

val sqlContext = new org.apache.spark.sql.SQLContext(sc) 

import spark.implicits._ 
import sqlContext.implicits._ 

case class Person(a: Int, b: Int) 

val ppl = sc.textFile("newfile.txt").map(_.split(",")) 
    .map(p=> Person(p(0).trim.toInt, p(1).trim.toInt)) 
    .toDF() 
ppl.registerTempTable("people") 

val result = ppl.select("a","b").groupBy('a).agg() 
result.show 

期望輸出是:

a 32, 33, 44, 23 

b 21, 56 

而不是通過sum,count,mean等進行聚合我想要行中的每個元素。

+2

嗨@ priyanka178,若跌破的回答已經解決了您的問題,請考慮[接受它( http://meta.stackexchange.com/q/5234/179419)或添加您自己的解決方案。所以,這表明你已經找到了解決方案。沒有義務這樣做。 – mrsrinivas

回答

5

嘗試collect_set函數內部agg()

val df = sc.parallelize(Seq(
    (1,3), (1,6), (1,5), (2,1),(2,4) 
    (2,1))).toDF("a","b") 

+---+---+ 
| a| b| 
+---+---+ 
| 1| 3| 
| 1| 6| 
| 1| 5| 
| 2| 1| 
| 2| 4| 
| 2| 1| 
+---+---+ 

val df2 = df.groupBy("a").agg(collect_set("b")).show() 

+---+--------------+ 
| a|collect_set(b)| 
+---+--------------+ 
| 1|  [3, 6, 5]| 
| 2|  [1, 4]| 
+---+--------------+ 

如果你想重複的條目,可以使用collect_list

val df3 = df.groupBy("a").agg(collect_list("b")).show() 

+---+---------------+ 
| a|collect_list(b)| 
+---+---------------+ 
| 1|  [3, 6, 5]| 
| 2|  [1, 4, 1]| 
+---+---------------+