BigQuery 自动检测不适用于不一致的 json?

Posted

技术标签:

【中文标题】BigQuery 自动检测不适用于不一致的 json?【英文标题】:BigQuery autodetect doesn't work with inconsistent 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?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于BigQuery 自动检测不适用于不一致的 json?的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery“复制表”不适用于小表

BigQuery - 时间戳偏移不适用于 insertAll / Streaming?

JSON_EXTRACT 不适用于 BigQuery 中的布尔值

BigQuery MERGE 查询不适用于空的 REPEATED 字段

bigquery python 客户端:load_table_from_file 不适用于 csv 文件

是否可以使用架构自动检测加载 BigQuery 但修改自动检测的架构?