json 如何在Spark中将字符串解析为数组?

y53ybaqx  于 2023-02-14  发布在  Spark
关注(0)|答案(3)|浏览(622)

如何在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
bvuwiixz

bvuwiixz1#

引发异常的原因:

from_json(col("value"), ArrayType(StringType))

不是explode,具体来说:
输入架构数组必须是结构或结构数组。
您可以:

inputDS.selectExpr(
  "split(substring(value, 2, length(value) - 2), ',\\s+') as value")

并且explode是输出。

fivyi3re

fivyi3re2#

以上问题应该在Spark 2.4.0(https://jira.apache.org/jira/browse/SPARK-24391)中得到修复,因此您可以使用此from_json($"column_nm", ArrayType(StringType))而不会出现任何问题。

oknrviil

oknrviil3#

您可以简单地使用flatMap实现。

val input = sc.parallelize(Array("foo", "bar")).toDS()
val out = input.flatMap(x => x.split(","))
out.collect.foreach{println}

相关问题