将 Avro 文件加载到 BigQuery 失败并出现内部错误

Loading Avro-file to BigQuery fails with an internal error

Google BigQuery 在 March 23, 2016 announced "Added support for Avro source format for load operations and as a federated data source in the BigQuery API or command-line tool". It says here "This is a Beta release of Avro format support. This feature is not covered by any SLA or deprecation policy and may be subject to backward-incompatible changes." 上有。但是,我希望该功能能够正常工作。

我没有在任何地方找到关于如何使用 Avro 格式进行加载的代码示例。我也没有找到有关如何使用 bq-tool 进行加载的示例。

这是我的实际问题。我无法以 Avro 格式将数据加载到 BigQuery。

使用 bq-工具会发生以下情况。数据集、table 名称和存储桶名称已被混淆:

$ bq extract --destination_format=AVRO dataset.events_avro_test gs://BUCKET/events_bq_tool.avro Waiting on bqjob_r62088699049ce969_0000015432b7627a_1 ... (36s) Current status: DONE $ bq load --source_format=AVRO dataset.events_avro_test gs://BUCKET/events_bq_tool.avro Waiting on bqjob_r6cefe75ece6073a1_0000015432b83516_1 ... (2s) Current status: DONE BigQuery error in load operation: Error processing job 'dataset:bqjob_r6cefe75ece6073a1_0000015432b83516_1': An internal error occurred and the request could not be completed.

基本上,我从 table 中提取并插入到相同的 table 导致内部错误。

此外,我有 Java 程序执行相同的操作(从 table X 中提取并加载到 table X),结果相同(内部错误)。但我认为以上内容尽可能清楚地说明了问题,因此我不会在这里分享代码。在 Java 中,如果我从一个空的 table 中提取并插入它,插入作业不会失败。

我的问题是

2016 年 4 月 25 日更新:

到目前为止,我已经设法得到一个 Avro 加载作业,不会根据不使用 REQUIRED 字段的提示给出内部错误。但是,我还没有设法加载非空值。

考虑这个 Avro 模式:

{ "type": "record", "name": "root", "fields": [ { "name": "x", "type": "string" } ] }

BigQuery table 有一个列,xNULLABLE

如果我插入 N(我试过一两行)行(x 例如 1),我在 BigQuery 中得到了 N 行,但 x 总是有价值null.

如果我更改 table 使 XREQUIRED,我会收到内部错误。

此处 AVRO reader 的错误映射存在问题。错误应该是这样的:"The reference schema differs from the existing data: The required field 'api_key' is missing"

查看您的加载作业配置,它包含必填字段。听起来您尝试加载的某些数据未指定这些必填字段,因此操作失败。

我建议避免必填字段。

BQ 架构与 Avro 架构之间没有完全匹配,反之亦然,因此当您将 BQ table 导出到 Avro 文件然后再导回时,架构会有所不同。我看到您加载的目的地 table 已经存在,在这种情况下,当目的地 table 的模式与我们从 Avro 模式转换的模式不匹配时,我们会抛出错误。这应该是一个外部错误,我们正在调查为什么它是一个内部错误。

我们正在升级导出管道,新的导入管道有一个错误,无法处理当前管道导出的 Avro 文件。该修复程序应在几周内部署。之后,如果您将导出的文件导入到不存在的目标 table,或具有兼容架构的目标 table,它应该可以工作。同时,导入您自己的 Avro 文件应该可以。也可以不导入直接在GCS上查询

因此,BigQuery 中存在一个错误:如果目标 table 存在,则使用 Avro 格式的插入作业将不起作用,但会出现内部错误。解决方法是使用 createDisposition CREATE_IF_NEEDED 而不是在那里使用预先存在的 table。我验证了这有效。

Hua Zung 的评论说该错误将在 "the fix should be deployed in a couple weeks" 中修复。不用说,实时系统中现有的主要错误应该记录在某处。

在更新系统的同时,我真的建议改进Avro文档。现在没有提到 Avro 模式应该是什么样的(类型 record、名称 root 和字段数组具有列(?)),甚至没有提到 Avro 文件中的每条记录都映射到目的地 table 中的一行(显而易见,但应该提及)。也没有记录模式不匹配会发生什么。

感谢您的帮助,我现在将切换到 Avro 格式。它比 CSV 好多了。