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

时间:2016-04-20 08:38:08

标签: google-bigquery avro

Google BigQuery已经March 23, 2016 announced“添加了对加载操作的Avro源格式的支持,以及作为BigQuery API或命令行工具中的联合数据源”。它说here“这是Avro格式支持的Beta版本。任何SLA或弃用策略都不涵盖此功能,并且可能会受到向后不兼容的更改。”但是,我希望该功能能够正常运行。

我没有找到关于如何使用Avro格式加载的任何代码示例。我没有找到关于如何使用bq - 工具进行加载的示例。

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

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

$ 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表有一列xNULLABLE

如果我插入N(我已尝试过一行和两行)行(x为例如1),我在BigQuery中获得N行,但x总是具有值{{ 1}}。

如果我更改表格以使nullX,则会收到内部错误。

3 个答案:

答案 0 :(得分:0)

此处AVRO阅读器的错误映射存在问题。该错误应该是:"参考架构与现有数据不同:必填字段' api_key'缺少"

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

我建议避免使用必填字段。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

感谢您的帮助,我现在将转换为Avro格式。它比CSV好得多。