Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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 将数组的数据集转换为数据帧_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 将数组的数据集转换为数据帧

Scala 将数组的数据集转换为数据帧,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,给定数据集[数组[字符串]]。 实际上,此结构只有一个数组类型的字段。 是否有可能将其转换为数据帧,并将每个数组项放在单独的列中 如果我有RDD[Array[String]]我可以通过以下方式实现它: val rdd: RDD[Array[String]] = ??? rdd.map(arr => Row.fromSeq(arr)) 但令人惊讶的是,我不能对数据集[Array[String]]做同样的事情–它说行没有编码器 我不能用Tuple或case class替换数组,因为数组的大小

给定
数据集[数组[字符串]]
。 实际上,此结构只有一个数组类型的字段。 是否有可能将其转换为
数据帧
,并将每个数组项放在单独的列中

如果我有
RDD[Array[String]]
我可以通过以下方式实现它:

val rdd: RDD[Array[String]] = ???
rdd.map(arr => Row.fromSeq(arr))
但令人惊讶的是,我不能对
数据集[Array[String]]
做同样的事情–它说
行没有编码器


我不能用
Tuple
case class
替换数组,因为数组的大小在编译时是未知的。

在这里,您可以进行折叠来手动创建所有列

val df = Seq(Array("Hello", "world"), Array("another", "row")).toDS()
然后计算数组的大小

val size_array = df.first.length
然后使用foldLeft将列添加到数据帧:

0.until(size_array).foldLeft(df){(acc, number) => df.withColumn(s"col$number", $"value".getItem(number))}.show

这里我们的累加器是我们的df,我们只是一个接一个地添加列。

这里您可以进行折叠,手动创建所有列

val df = Seq(Array("Hello", "world"), Array("another", "row")).toDS()
然后计算数组的大小

val size_array = df.first.length
然后使用foldLeft将列添加到数据帧:

0.until(size_array).foldLeft(df){(acc, number) => df.withColumn(s"col$number", $"value".getItem(number))}.show

这里我们的累加器是我们的df,我们只需逐个添加列。

如果数组大小相同,可以使用“选择”:

val original: Dataset[Array[String]] = Seq(Array("One", "Two"), Array("Three", "Four")).toDS()
val arraySize = original.head.size
val result = original.select(
  (0 until arraySize).map(r => original.col("value").getItem(r)): _*)
result.show(false)
输出:

+--------+--------+
|value[0]|value[1]|
+--------+--------+
|One     |Two     |
|Three   |Four    |
+--------+--------+

如果阵列大小相同,则可以使用“选择”:

val original: Dataset[Array[String]] = Seq(Array("One", "Two"), Array("Three", "Four")).toDS()
val arraySize = original.head.size
val result = original.select(
  (0 until arraySize).map(r => original.col("value").getItem(r)): _*)
result.show(false)
输出:

+--------+--------+
|value[0]|value[1]|
+--------+--------+
|One     |Two     |
|Three   |Four    |
+--------+--------+

使用ds.toDF是否会得到相同的异常?哪个异常?我的代码示例中没有抛出异常,只是没有编译。很抱歉,我的意思是错误,但现在意识到toDF不是您要查找的对象。使用ds.toDF是否会得到相同的异常?哪个异常?在我的代码示例中并没有抛出异常——它只是无法编译。很抱歉,我的意思是错误,但现在意识到toDF不是您想要的