2016-08-15 143 views
0

我想根据它们的ID将数据帧拆分为多个数组。将数据帧拆分为数组scala

所以我有一个表

id|name 
12|a 
12|b 
12|c 
13|z 
13|y 
13|z 

,我想看起来像多个向量:

<a,b,c> <x,y,z> 

所以我设法利用所有不同的ID:

val ids=dataframe.select("id").distinct.collect.flatMap(_.toSeq) 

那将返回12和13. 我试图让他们每个人的名字:

val namesArray=ids.map(id=>dataframe.where($"id"===id)) 

但这似乎不是因为它返回的列名称的方式,我应该找到一种方法来获取只有名称。

回答

1

如果你已经有了你的数据DataSet那么你就可以做到以下几点,

val yourDataSet = sc.parallelize(List((12, "a"), (12, "b"), (13, "y"), (13, "z"))).toDF("id", "val") 

val requiredDataSet = yourDataSet 
    .groupBy("id") 
    .agg(collect_list("val")) 
    .select("collect_list(val)") 

或者您也可以通过获取底层个R dd,然后将其转化实现这一目标。

val vaueVectorRdd = dataframe.rdd 
    .map(row.getInt(0), row.getString(1)) 
    .groupByKey({ case (k, v) => k }) 
    .map({ case (k, iter) => iter.map(_._2).toVector }) 
+0

谢谢@Saravesh Kumar Singh的回复。 collect_list不被编译器识别。你是什​​么意思? – Kratos

+0

'org.apache.spark.sql.functions.collect_list' –