2017-01-10 157 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]| 
+---+---------------+