2016-08-15 149 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' –