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 - 时间戳偏移不适用于 insertAll / Streaming?
JSON_EXTRACT 不适用于 BigQuery 中的布尔值
BigQuery MERGE 查询不适用于空的 REPEATED 字段