2017-01-10 4 views
2

У меня есть данные в файле в следующем формате:Spark: Как сгруппировать по различным значениям в DataFrame

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 

Вместо агрегации по сумме, счету, среднему и т. Д. Я хочу, чтобы каждый элемент в строке.

+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]| 
+---+---------------+ 

 Смежные вопросы

  • Нет связанных вопросов^_^