首页 文章

将Avro文件加载到BigQuery会因内部错误而失败

提问于
浏览
1

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" . 它说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 -tool会发生以下情况 . 数据集,表名和存储桶名称已经过模糊处理:

$ 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.

基本上,我从表中提取并插入到同一个表中导致内部错误 .

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

我的问题是

  • 我认为BigQuery API永远不会因内部错误而失败 . 为什么我的测试会发生这种情况?

  • 提取的Avro文件是否与插入作业兼容?

  • 似乎没有说明插入作业中的Avro架构是什么样的,至少我找不到 . 可以创建文档吗?

更新2016-04-25:

到目前为止,我已经设法让Avro加载作业不基于不使用 REQUIRED 字段的提示给出内部错误 . 但是,我还没有设法加载非空值 .

考虑这个Avro架构:

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

BigQuery表有一列 x ,即 NULLABLE .

如果我插入N(我已尝试过一行和两行)( x 例如 1 ),我在BigQuery中有N行,但 x 总是有值 null .

如果我更改表,以便 XREQUIRED 我收到内部错误 .

3 回答

  • 0

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

    我们正在升级导出管道,新的导入管道有一个错误,不能与当前管道导出的Avro文件一起使用 . 应该在几周内部署修复程序 . 之后,如果将导出的文件导入到不存在的目标表或具有兼容模式的目标表,则应该可以使用 . 同时,导入您自己的Avro文件应该可以工作 . 您也可以直接在GCS上查询它而无需导入它 .

  • 0

    这里AVRO阅读器的错误映射存在问题 . 该错误应该是这样的:“参考模式与现有数据不同:缺少必需字段'api_key'”

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

    我建议避免必填字段 .

  • 0

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

    华宗的评论说,该错误将在“应该在几周内部署”中修复 . 毋庸置疑,现场系统中存在的主要错误应该记录在某处 .

    在更新系统时,我确实建议改进Avro文档 . 现在没有提到Avro架构应该是什么样的(键入 record ,名称 root 和具有列(?)的字段数组),甚至没有提到Avro文件中的每条记录都映射到目标表中的一行(显而易见) ,但应该提到) . 此外,架构不匹配的情况也未记录 .

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

相关问题