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中,如果我从空表中提取并插入,则插入作业不会失败。
我的问题是
更新2016-04-25:
到目前为止,我已经设法让Avro加载作业不会根据不使用REQUIRED
字段的提示给出内部错误。但是,我还没有设法加载非空值。
考虑这个Avro架构:
{
"type": "record",
"name": "root",
"fields": [
{
"name": "x",
"type": "string"
}
]
}
BigQuery表有一列x
,NULLABLE
。
如果我插入N(我已尝试过一行和两行)行(x
为例如1
),我在BigQuery中获得N行,但x
总是具有值{{ 1}}。
如果我更改表格以使null
为X
,则会收到内部错误。
答案 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好得多。