将 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 中提取并插入它,插入作业不会失败。
我的问题是
- 我认为 BigQuery API 永远不会因内部错误而失败。为什么我的测试会发生这种情况?
- 提取的 Avro 文件是否与插入作业兼容?
- 似乎没有说明插入作业中的 Avro 模式是什么样的,至少我找不到。可以创建文档吗?
2016 年 4 月 25 日更新:
到目前为止,我已经设法得到一个 Avro 加载作业,不会根据不使用 REQUIRED
字段的提示给出内部错误。但是,我还没有设法加载非空值。
考虑这个 Avro 模式:
{
"type": "record",
"name": "root",
"fields": [
{
"name": "x",
"type": "string"
}
]
}
BigQuery table 有一个列,x
即 NULLABLE
。
如果我插入 N(我试过一两行)行(x
例如 1
),我在 BigQuery 中得到了 N 行,但 x
总是有价值null
.
如果我更改 table 使 X
为 REQUIRED
,我会收到内部错误。
此处 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 好多了。
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 中提取并插入它,插入作业不会失败。
我的问题是
- 我认为 BigQuery API 永远不会因内部错误而失败。为什么我的测试会发生这种情况?
- 提取的 Avro 文件是否与插入作业兼容?
- 似乎没有说明插入作业中的 Avro 模式是什么样的,至少我找不到。可以创建文档吗?
2016 年 4 月 25 日更新:
到目前为止,我已经设法得到一个 Avro 加载作业,不会根据不使用 REQUIRED
字段的提示给出内部错误。但是,我还没有设法加载非空值。
考虑这个 Avro 模式:
{
"type": "record",
"name": "root",
"fields": [
{
"name": "x",
"type": "string"
}
]
}
BigQuery table 有一个列,x
即 NULLABLE
。
如果我插入 N(我试过一两行)行(x
例如 1
),我在 BigQuery 中得到了 N 行,但 x
总是有价值null
.
如果我更改 table 使 X
为 REQUIRED
,我会收到内部错误。
此处 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 好多了。