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

3
如何在Spark 2.2.0中将字符串数组展平为数据框的多行?
输入行 ["foo", "bar"]
val inputDS = Seq("""["foo", "bar"]""").toDF

inputDS.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

如果您只有一个字符串数组,则不需要 from_json 部分。只需尝试 inputDS.select(explode(col("value"))) 即可。 - Shaido
之前尝试过,现在又尝试了一遍。我得到了以下错误信息:org.apache.spark.sql.AnalysisException: 由于数据类型不匹配,无法解析 'explode(value)':传递给函数 explode 的输入应该是数组或映射类型,而不是 StringType - user1870400
看起来你实际上没有一个数组,而是一个字符串。一个选项是看一下split函数,并将其与explode一起使用。你能再次检查输入并更新问题吗? - Shaido
更新了,这正是我所拥有的,这些正是我得到的确切错误。 - user1870400
3个回答

6

异常由以下发起:

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

不是 explode ,具体来说:

输入的 schema 数组必须是结构体或结构体数组。

您可以:

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

explode 输出。


0

-2

你可以简单地使用 flatMap 来实现。

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

抱歉,这不是我想要的,因为这不符合我的代码。这里的问题只是我更大问题的简化版本。 - user1870400
我没有给你点踩。我不确定是谁干的。 - user1870400

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接