作为输入,我将每行格式化为单个JSON对象的一组文件作为输入。但是,问题在于这些JSON对象上的一个字段是JSON转义的String。例
{ "id":1, "name":"some name", "problem_field": "{\"height\":180,\"weight\":80,}", }
预期使用sqlContext.read.json它时,将创建一个具有3列ID,名称和问题字段的数据帧,其中问题字段是字符串。
sqlContext.read.json
我无法控制输入文件,因此我希望能够在Spark中解决此问题,因此,有什么办法可以让Spark将String字段读取为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)