【问题标题】:Processing JSON in spark - different schemas in different files在火花中处理 JSON - 不同文件中的不同模式
【发布时间】:2019-04-04 15:28:47
【问题描述】:

我有大量从第三方获得的 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 apache-spark schema


    【解决方案1】:

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

    如果您有一个带有您满意的模式的 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 模式,除了这个字段之外,这是完全正确的。
    • 您可以选择一个包含您需要的所有字段的文件或对其进行扩充并将其单独存储在路径 PATH_TO_JSON_WITH_RIGHT_SCHEMA 中,并始终使用它来推断正确的架构(解决方案的第一行),而不是使用推断的架构来读取所有其他文件, spark.read.schema(jsonWithSchema.schema).json 应该在一个字段为坏的文件上强制使用正确的架构。试试看,告诉我结果如何。
    猜你喜欢
    • 2019-08-16
    • 1970-01-01
    • 2017-11-25
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2021-05-17
    • 2018-04-12
    相关资源
    最近更新 更多