如何让 Spark 将 JSON 转义字符串字段解析为 JSON 对象以推断数据帧中的正确结构?

How to let Spark parse a JSON-escaped String field as a JSON Object to infer the proper structure in DataFrames?

我输入了一组文件,格式为每行一个 JSON 对象。然而,问题是这些 JSON 对象上的一个字段是 JSON 转义字符串。例子

{
  "id":1,
  "name":"some name",
  "problem_field": "{\"height\":180,\"weight\":80,}",
}

预期,当使用 sqlContext.read.json 时,它将创建一个具有 3 列 ID、名称和 problem_field 的 DataFrame,其中 problem_field 是一个字符串。

我无法控制输入文件,我希望能够在 Spark 中解决这个问题,所以,有什么方法可以让 Spark 读取该字符串字段作为 JSON 和正确推断其架构?

注意:上面的 json 只是一个玩具示例,在我的例子中 problem_field 将具有可变的不同字段,Spark 可以推断这些字段并且我不必对存在哪些字段做出任何假设。

这是可以接受的解决方案吗?

val sc: SparkContext = ...
val sqlContext = new SQLContext(sc)

val escapedJsons: RDD[String] = sc.parallelize(Seq("""{"id":1,"name":"some name","problem_field":"{\"height\":180,\"weight\":80}"}"""))
val unescapedJsons: RDD[String] = escapedJsons.map(_.replace("\"{", "{").replace("\"}", "}").replace("\\"", "\""))
val dfJsons: DataFrame = sqlContext.read.json(unescapedJsons)

dfJsons.printSchema()

// Output
root
|-- id: long (nullable = true)
|-- name: string (nullable = true)
|-- problem_field: struct (nullable = true)
|    |-- height: long (nullable = true)
|    |-- weight: long (nullable = true)