读取带有模式的 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 文件读取到布尔列

php json_decode json字符串返回NULL

PHP 数组中出现中文乱码,json_encode返回结果为null 或false

Flutter 从 Json 转换嵌套对象返回 null

Spark 读取带有部分模式的 json