我输入了一组格式为每行一个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很好地推断这些字段并且我不必对存在哪些字段做出任何假设。
答案 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)