小编典典

如何让Spark将JSON转义的String字段解析为JSON对象,以推断DataFrames中的适当结构?

json

作为输入,我将每行格式化为单个JSON对象的一组文件作为输入。但是,问题在于这些JSON对象上的一个字段是JSON转义的String。例

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

预期使用sqlContext.read.json它时,将创建一个具有3列ID,名称和问题字段的数据帧,其中问题字段是字符串。

我无法控制输入文件,因此我希望能够在Spark中解决此问题,因此,有什么办法可以让Spark将String字段读取为JSON并正确推断其模式?

注意:上面的json只是一个玩具示例,在我的案例中,problem_field将具有可变的不同字段,这对于Spark推断这些字段非常有用,而我不必对存在哪些字段进行任何假设。


阅读 369

收藏
2020-07-27

共1个答案

小编典典

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

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)
2020-07-27