读取带有模式的 JSON 数组字符串返回 null spark 2.2.0
Posted
技术标签:
【中文标题】读取带有模式的 JSON 数组字符串返回 null spark 2.2.0【英文标题】:Read JSON Array string with schema returns null spark 2.2.0 【发布时间】:2019-03-21 17:58:18 【问题描述】:当我尝试读取包含 JSON 字符串作为数组的 spark 数据框列时,使用已定义的架构,它返回 null。我尝试了 Array、Seq 和 List 的架构,但都返回 null。我的火花版本是 2.2.0
val dfdata= spark.sql("""select "\[ \"id\":\"93993\", \"name\":\"Phil\" , \"id\":\"838\", \"name\":\"Don\" ]" as theJson""")
dfdata.show(5,false)
val sch = StructType(
Array(StructField("id", StringType, true),
StructField("name", StringType, true)))
print(sch.prettyJson )
dfdata.select(from_json($"theJson", sch)).show
和输出
+---------------------------------------------------------------+
|theJson |
+---------------------------------------------------------------+
|[ "id":"93993", "name":"Phil" , "id":"838", "name":"Don" ]|
+---------------------------------------------------------------+
"type" : "struct",
"fields" : [
"name" : "id",
"type" : "string",
"nullable" : true,
"metadata" :
,
"name" : "name",
"type" : "string",
"nullable" : true,
"metadata" :
]
+----------------------+
|jsontostructs(theJson)|
+----------------------+
| null|
+----------------------+
【问题讨论】:
试试 dfdata.select("theJson").show 然后你会得到你期望的数据。 @AlexandrosBiratsis,只给出原始 JSON 字符串,我想做的是,读取 JSON 数据并拆分为单独的列,如 id 和 name How do I use a from_json() dataframe in Spark?的可能重复 我认为上面的链接是您正在寻找的答案:) 试过 newDF.select ($"parsed.id",$"parsed.name").show(false),给了 +----+----+ |id |name| +----+----+ |null|null| +----+----+ 【参考方案1】:您的架构不太适合您的示例。您的示例是一个结构数组。尝试将其包装在 ArrayType
:
val sch = ArrayType(StructType(Array(
StructField("id", StringType, true),
StructField("name", StringType, true)
)))
【讨论】:
【参考方案2】:你有没有尝试在获取 DF 之前解析你的 json 字符串?
// obtaining this string should be easy:
val jsonStr = """[ "id":"93993", "name":"Phil" , "id":"838", "name":"Don" ]"""
// then you can take advantage of schema inference
val df2 = spark.read.json(Seq(jsonStr).toDS)
df2.show(false)
// it shows:
// +-----+----+
// |id |name|
// +-----+----+
// |93993|Phil|
// |838 |Don |
// +-----+----+
【讨论】:
我的输入数据集是一个 csv 文件,其中的列是 JSON 和其他格式,我不确定读取整个文件,因为 JSON 文件会满足我的要求。以上是关于读取带有模式的 JSON 数组字符串返回 null spark 2.2.0的主要内容,如果未能解决你的问题,请参考以下文章
JSON Serialize数组在JSON字符串中返回NULL
熊猫 |将带有类似列表/数组的字段的 json 文件读取到布尔列