Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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_Dataframe - Fatal编程技术网

Scala 将结构数组分解为Spark中的列

Scala 将结构数组分解为Spark中的列,scala,apache-spark,dataframe,Scala,Apache Spark,Dataframe,我想将结构数组分解为列(由结构字段定义)。例如 应该转化为 root |-- id: long (nullable = true) |-- name: string (nullable = true) 我可以通过以下方式实现这一点: df .select(explode($"arr").as("tmp")) .select($"tmp.*") 如何在单个select语句中实现这一点 我认为这可以奏效,但不幸的是,它没有: df.select(explode($"arr")(".*

我想将结构数组分解为列(由结构字段定义)。例如

应该转化为

root
 |-- id: long (nullable = true)
 |-- name: string (nullable = true)
我可以通过以下方式实现这一点:

df
  .select(explode($"arr").as("tmp"))
  .select($"tmp.*")
如何在单个select语句中实现这一点

我认为这可以奏效,但不幸的是,它没有:

df.select(explode($"arr")(".*"))
线程“main”org.apache.spark.sql.analysis异常:否 此类结构字段。*列中


单步解决方案仅适用于
MapType
列:

val df = Seq(Tuple1(Map((1L, "bar"), (2L, "foo")))).toDF

df.select(explode($"_1") as Seq("foo", "bar")).show

+---+---+
|foo|bar|
+---+---+
|  1|bar|
|  2|foo|
+---+---+
对于阵列,您可以使用
flatMap

val df = Seq(Tuple1(Array((1L, "bar"), (2L, "foo")))).toDF
df.as[Seq[(Long, String)]].flatMap(identity)
一个
SELECT
语句可以用SQL编写:

 df.createOrReplaceTempView("df")

spark.sql("SELECT x._1, x._2 FROM df LATERAL VIEW explode(_1) t AS x")

使用Map的第一个解决方案与O/P的模式不匹配,第二个解决方案类似于使用O/P已经实现的两个选择。不是吗?
 df.createOrReplaceTempView("df")

spark.sql("SELECT x._1, x._2 FROM df LATERAL VIEW explode(_1) t AS x")