2017-07-24 89 views
0

我有一個DataFrame有80列,我需要得到他們12集合,要麼ArrayList是好的。我做了一點谷歌,並發現這一點:如何從數據幀列成火花列表

dataFrame.select("YOUR_COLUMN_NAME").rdd.map(r => r(0)).collect() 

問題是,這適用於一列。如果我做df.select(col1,col2,col3...).rdd.map.collect(),那麼它給了我這樣的東西:Array[[col1,col2,col3]]

我想要的是Array[[col1],[col2],[col3]]。有沒有辦法在Spark中做到這一點?

在此先感謝。

UPDATE

比如我有一個數據幀:

---------- 
A B C 
---------- 
1 2 3 
4 5 6 

我需要的列到這個格式:

Array[[1,4],[2,5],[3,6]] 

希望這是更清晰...對不起

回答

2

你可以得到Array[Array[Any]]通過執行以下操作

scala> df.select("col1", "col2", "col3", "col4").rdd.map(row => (Array(row(0)), Array(row(1)), Array(row(2)), Array(row(3)))) 
res6: org.apache.spark.rdd.RDD[(Array[Any], Array[Any], Array[Any], Array[Any])] = MapPartitionsRDD[34] at map at <console>:32 

RDD就像是一個Array所以你需要陣列的上方。如果你想RDD[Array[Array[Any]]]那麼你可以做

scala> df.select("col1", "col2", "col3", "col4").rdd.map(row => Array(Array(row(0)), Array(row(1)), Array(row(2)), Array(row(3)))) 
res7: org.apache.spark.rdd.RDD[Array[Array[Any]]] = MapPartitionsRDD[39] at map at <console>:32 

您可以繼續以同樣的方式爲你的12列

更新

你更新的問題更加清晰。因此,在轉換爲rdd之前,您可以使用collect_list函數,並像以前一樣繼續。

scala> import org.apache.spark.sql.functions._ 
import org.apache.spark.sql.functions._ 

scala> val rdd = df.select(collect_list("col1"), collect_list("col2"), collect_list("col3"), collect_list("col4")).rdd.map(row => Array(row(0), row(1), row(2), row(3))) 
rdd: org.apache.spark.rdd.RDD[Array[Any]] = MapPartitionsRDD[41] at map at <console>:36 

scala> rdd.map(array => array.map(element => println(element))).collect 
[Stage 11:>               (0 + 0)/2]WrappedArray(1, 1) 
WrappedArray(2, 2) 
WrappedArray(3, 3) 
WrappedArray(4, 4) 
res8: Array[Array[Unit]] = Array(Array((),(),(),())) 

數據幀只

你可以做所有這些在數據幀本身並不需要轉換爲RDD

因爲你有數據幀作爲

scala> df.show(false) 
+----+----+----+----+----+----+ 
|col1|col2|col3|col4|col5|col6| 
+----+----+----+----+----+----+ 
|1 |2 |3 |4 |5 |6 | 
|1 |2 |3 |4 |5 |6 | 
+----+----+----+----+----+----+ 

您可以簡單地執行以下操作:

scala> import org.apache.spark.sql.functions._ 
import org.apache.spark.sql.functions._ 

scala> df.select(array(collect_list("col1"), collect_list("col2"), collect_list("col3"), collect_list("col4")).as("collectedArray")).show(false) 
+--------------------------------------------------------------------------------+ 
|collectedArray                 | 
+--------------------------------------------------------------------------------+ 
|[WrappedArray(1, 1), WrappedArray(2, 2), WrappedArray(3, 3), WrappedArray(4, 4)]| 
+--------------------------------------------------------------------------------+ 
+0

嗯,兩條線之間有什麼區別...?他們都給我RDD數組,我怎麼得到數組[數組]? – Anna

+0

我的不好:)我粘貼上一步。我已更新請檢查 –

+0

我沒有找到更新:(?他們仍然看起來都像rdd陣列給我 – Anna