json - 在 spark 中处理 JSON - 不同文件中的不同模式

标签 json apache-spark schema

我有大量从第 3 方获得的 JSON 文件。它们都具有相同的模式,除了当嵌套元素为空时,它表示为空数组。

第一个例子

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

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

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

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

这显然在原理上不兼容,但我无法影响这一点,因为数据来自第 3 方。

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

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

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

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

谁能给我提示这个问题的解决方案?

最佳答案

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

如果您有一个 JSON 文件,您对它的模式感到满意,最好是一个小的,您可以使用它的模式来读取所有其他 JSON 文件:

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

关于json - 在 spark 中处理 JSON - 不同文件中的不同模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53083788/

相关文章:

java - 在没有 key 的情况下迭代/获取 JSONArray 内的 JSONObject

sql - Flyway:无法在 'installed_on' 中插入值 NULL,表 'schema_version' 列不允许为空。插入失败

sql - 将字段存储为单一文本类型 JSON 字符串与拆分到单独表的性能影响

javascript - 以 JSON 或 var 形式传递对象(拖放)

c++ - 有关如何读取,写入和打印QJson代码的最小示例(使用QJsonDocument,QJsonArray,QJsonObject和QFile)

apache-spark - 为 pyspark 配置 pycharm IDE - 第一个脚本异常

hadoop - Apache Spark : NPE during restoring state from checkpoint

apache-spark - 溢出到磁盘并随机写入 Spark

sharepoint-2010 - 通过 schema.xml 增强富文本字段

java - json解析问题