Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何将数据框中的列放入spark中的列表中_Scala_Apache Spark - Fatal编程技术网

Scala 如何将数据框中的列放入spark中的列表中

Scala 如何将数据框中的列放入spark中的列表中,scala,apache-spark,Scala,Apache Spark,我有一个DataFrame,它有大约80列,我需要将其中的12列放入一个集合中,Array或List都可以。我在谷歌上搜索了一下,发现: dataFrame.select("YOUR_COLUMN_NAME").rdd.map(r => r(0)).collect() 问题是,这只适用于一列。如果我做了df.select(col1,col2,col3…).rdd.map.collect(),那么它会给我这样的信息:Array[[col1,col2,col3]] 我想要的是数组[[col1

我有一个
DataFrame
,它有大约80列,我需要将其中的12列放入一个集合中,
Array
List
都可以。我在谷歌上搜索了一下,发现:

dataFrame.select("YOUR_COLUMN_NAME").rdd.map(r => r(0)).collect()
问题是,这只适用于一列。如果我做了
df.select(col1,col2,col3…).rdd.map.collect()
,那么它会给我这样的信息:
Array[[col1,col2,col3]]

我想要的是
数组[[col1]、[col2]、[col3]]
。在Spark中有什么方法可以做到这一点吗

提前谢谢

更新

例如,我有一个数据帧:

----------
A   B   C
----------
1   2   3
4   5   6
我需要将列转换为以下格式:

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

希望这一点更清楚…很抱歉造成混淆

您可以通过执行以下操作获得
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
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)]|
+--------------------------------------------------------------------------------+
你可以用同样的方法处理你的12列

已更新

你最新的问题更清楚了。因此,在转换为
rdd
之前,您可以使用
collect\u 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((), (), (), ())) 
您可以简单地执行以下操作

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

您可以通过执行以下操作获得
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
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)]|
+--------------------------------------------------------------------------------+
你可以用同样的方法处理你的12列

已更新

你最新的问题更清楚了。因此,在转换为
rdd
之前,您可以使用
collect\u 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((), (), (), ())) 
您可以简单地执行以下操作

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

嗯,这两行之间有什么区别吗。。。?他们都给我RDD数组,我如何得到数组[array]?我的坏:)我粘贴了上一步。我已经更新了请检查我没有找到更新:(?它们在meorg.apache.spark.rdd.rdd[(Array[Any],Array[Any],Array[Any],Array[Any])]中仍然看起来都像rdd数组这是数组类型吗?还有没有任何方法将其放入这样的东西中:[Array[Any],Array[Any],Array[Any],Array[Any]],而不是在()?RDD本身就像我在回答中提到的数组一样。[]是数组的表示形式。顺便说一句,我通过打印元素更新了我的答案。更明显的是,我在解释这两行之间有什么区别吗…?他们都给了我RDD数组,我如何得到数组[array]?我的错:)我粘贴了上一步。我已经更新了请检查我没有找到更新:(?它们在meorg.apache.spark.rdd.rdd[(Array[Any],Array[Any],Array[Any],Array[Any])]中仍然看起来都像rdd数组这是数组类型吗?还有没有任何方法将其放入这样的东西中:[Array[Any],Array[Any],Array[Any],Array[Any]],而不是在()?RDD本身就像我在回答中提到的数组一样。[]是数组的表示形式。顺便说一句,我通过打印元素更新了我的答案。这更清楚地说明了我要解释的内容