在Spark中处理JSON-不同文件中的不同架构

时间:2018-10-31 12:51:25

标签: json apache-spark schema

我有很多从第三方获得的JSON文件。它们都具有相同的架构,除了当嵌套元素为空时,它表示为空数组。

第一个例子

{
....
"survey_data":
    {
        "2": { "question":"....", "answer_id":"....", .... },
        "3": { "question":"....", "answer_id":"....", .... },
    }
 }

这是一个有效的JSON,“ survey_data”元素是struct_type,但是具有非常复杂的嵌套结构(比此简化示例中的子元素更多)

但是,当survey_data没有嵌套元素时,它将表示为空数组:

{
....
"survey_data": []
 }

这显然在原理上是不兼容的,但是由于数据来自第三方,所以我不能影响这一点。

当我想将这些JSON文件作为单个数据帧加载到spark中时,spark会推断Survey_data类型为字符串,并转义所有字符:

"survey_data":"{\"2\":{\"question\": ...

这显然对我不利,我看到了两种解决方法:

  1. 以某种方式将文件预处理为纯文本并删除[]个字符?
  2. 使用spark删除数组字符,或告诉spark该列应为结构类型?

有人能提示我解决此问题的方法吗?

1 个答案:

答案 0 :(得分:0)

我认为这应该可行,很久以前就做到了。

如果您有一个满意的带有模式的JSON文件,最好是一个很小的文件,则可以使用其模式读取所有其他JSON文件:

val jsonWithSchema = spark.read.json("PATH_TO_JSON_WITH_RIGHT_SCHEMA")
val df = spark.read.schema(jsonWithSchema.schema).json("PATH_TO_DATAFILES")