【问题标题】:BigQuery autodetect doesn't work with inconsistent json?BigQuery 自动检测不适用于不一致的 json?
【发布时间】:2020-03-30 18:00:49
【问题描述】:

我正在尝试使用--autodetect 将 JSON 上传到 BigQuery,因此我不必手动发现和写出整个架构。 JSON 的行并不都具有相同的形式,因此在后面的行中引入了字段,而在前面的行中没有。

不幸的是,我遇到了以下失败:

Upload complete.
Waiting on bqjob_r1aa6e3302cfc399a_000001712c8ea62b_1 ... (1s) Current status: DONE
BigQuery error in load operation: Error processing job '[...]:bqjob_r1aa6e3302cfc399a_000001712c8ea62b_1': Error while reading data, error message: JSON table encountered too many errors, giving up.
Rows: 1209; errors: 1. Please look into the errors[] collection for more details.
Failure details:
- Error while reading data, error message: JSON processing
encountered too many errors, giving up. Rows: 1209; errors: 1; max
bad: 0; error percent: 0
- Error while reading data, error message: JSON parsing error in row
starting at position 829980: No such field:
mc.marketDefinition.settledTime.

这是我要上传的数据:https://gist.github.com/max-sixty/c717e700a2774ba92547c7585b2b21e3

也许自动检测使用前 n 行,然后如果 n 之后的行不同则失败?如果是这样的话,有什么办法可以解决这个问题吗?

我可以使用任何工具从整个文件中提取架构,然后显式传递给 BigQuery?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    我找到了两个可以提供帮助的工具:

    • bigquery-schema-generator 0.5.1 使用所有数据来获取架构,而不是像 BigQuery 这样的 100 个样本行。

    • Spark SQL,你应该设置你的开发环境,或者至少安装 Spark 并调用 spark-shell 工具。

    但是,我注意到该文件打算失败,请在您共享的链接中查看此文本:“BigQuery 自动检测失败示例”。所以,我不太确定这些工具是否适用于打算失败的 json 文件。

    最后但同样重要的是,我在手动删除有问题的字段后导入了 json:“settledTime”:“2020-03-01T02:55:47.000Z”。

    希望这些信息对您有所帮助。

    【讨论】:

    • 架构生成器看起来很棒!我会检查一下。待定,它不是为失败而设计的(??),它旨在展示我所看到的失败
    【解决方案2】:

    是的,请参阅此处的文档: https://cloud.google.com/bigquery/docs/schema-detect

    启用自动检测后,BigQuery 会通过选择数据源中的随机文件并扫描多达 100 行数据以用作代表性样本来启动推理过程。 BigQuery 然后检查每个字段并尝试根据示例中的值为该字段分配数据类型。

    因此,如果其余行中的数据不符合初始行,则不应使用自动检测并需要提供显式架构。

    【讨论】:

      【解决方案3】:

      自动检测可能无法正常工作,因为它只查看前 100 行来检测架构。对 JSON 使用模式检测可能是一项代价高昂的工作。

      如何使用带有 AllowFieldAddition 选项的 BqTail 以经济高效地扩展架构。

      您可以简单地将以下摄取工作流与 CLI 或无服务器一起使用

      bqtail -r=rule.yaml -s=sourceURL
      

      @rule.yaml

      When:
        Prefix: /data/somefolder
        Suffix: .json
      Async: false
      
      Dest:
        Table: mydataset.mytable
        AllowFieldAddition: true
        Transient:
          Template: mydataset.myTableTempl
          Dataset: temp
      
      Batch:
        MultiPath: true
        Window:
          DurationInSec: 15
      OnSuccess:
        - Action: delete
      

      JSON with allow field addition e2e test case

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-21
        • 2020-05-05
        • 2016-10-10
        • 2022-11-03
        • 2011-05-13
        • 2018-01-13
        • 1970-01-01
        • 2021-08-10
        相关资源
        最近更新 更多