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")