如何让Spark将JSON转义的String字段解析为JSON对象以推断DataFrame中的正确结构?

时间:2016-05-14 10:22:11

标签: json scala apache-spark spark-dataframe

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

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

预计在使用sqlContext.read.json时,它会创建一个DataFrame,其中包含3列id,name和problem_field,其中problem_field是一个String。

我无法控制输入文件,我宁愿能够在Spark中解决这个问题所以,有没有什么方法可以让Spark将String字段读取为JSON并正确推断其架构?

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

1 个答案:

答案 0 :(得分:6)

这是否可以接受?

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)