如何在Spark 2.2.0中将字符串数组扁平化为 Dataframe 的多行?
输入行["foo", "bar"]
val inputDS = Seq("""["foo", "bar"]""").toDF
输入DS.printSchema()
root
|-- value: string (nullable = true)
输入数据集inputDS
inputDS.show(false)
value
-----
["foo", "bar"]
预期输出数据集outputDS
value
-------
"foo" |
"bar" |
我尝试了explode
函数,如下所示,但它不太工作
inputDS.select(explode(from_json(col("value"), ArrayType(StringType))))
得到了以下错误
org.apache.spark.sql.AnalysisException: cannot resolve 'jsontostructs(`value`)' due to data type mismatch: Input schema string must be a struct or an array of structs
还尝试了以下操作
inputDS.select(explode(col("value")))
我得到了以下错误
org.apache.spark.sql.AnalysisException: cannot resolve 'explode(`value`)' due to data type mismatch: input to function explode should be array or map type, not StringType
3条答案
按热度按时间bvuwiixz1#
引发异常的原因:
不是
explode
,具体来说:输入架构数组必须是结构或结构数组。
您可以:
并且
explode
是输出。fivyi3re2#
以上问题应该在Spark 2.4.0(https://jira.apache.org/jira/browse/SPARK-24391)中得到修复,因此您可以使用此
from_json($"column_nm", ArrayType(StringType))
而不会出现任何问题。oknrviil3#
您可以简单地使用flatMap实现。