首页 > 解决方案 > 使用带有自动模式检索的 LoadJobs 时如何处理 Avro 到 BigQuery 的类型转换

问题描述

我们在 Avro 中定义了一个公司范围的共享模型,并希望使用LoadJobs自动模式检索将此模型数据加载到 BigQuery 中,然后能够将数据导出(到 Google Cloud Storage 或其他地方)并使用相同的方法反序列化/读取它Avro 模型。

这种方法的问题是导出的 Avro 模式与加载的模式不同,因此使用与加载相同的模式进行反序列化会失败。

我们看到以下不兼容的类型转换:

模型架构(加载时使用) 派生的 BigQuery 类型 架构(导出后)
int INTEGER long
float FLOAT double
time-millis TIME time-micros
timestamp-millis TIMESTAMP timestamp-micros
map REPEATED RECORD array

Fmpov 我只看到以下解决这个问题的方法:

  1. 预先创建表+模式而不是使用自动检索
  2. 加载到 BigQuery 和/或从 BigQuery 导出时使用适配器
  3. 更改 Avro 架构以使用与 BigQuery“兼容”(在加载和导出之间未更改)的类型

还有什么想法吗?

标签: google-bigqueryavro

解决方案


当您将一些数据从 BigQuery 导出为 Avro 格式时,它将创建一个方案,而无法定义自定义方案。您可以在此处根据 BigQuery 方案检查目标 Avro 字段类型。

您关于预先创建表而不是使用自动检索的第一个想法似乎不是一个有用的解决方法,因为在您的情况下,导出它们时没有与您的 Avro 架构匹配的 BigQuery 类型。

在您的情况下,使用适配器似乎是最佳选择,也许直接将BigQuery 中的日期和日期时间导出为毫秒可以让您的生活更轻松。此外,根据您在 BigQuery 上所做的事情,您还可以考虑在将数据导入 BigQuery 时不要使用 Avro 逻辑类型,但是还有一种方法可以使适配器实现更容易,而不是避免使用的解决方案其中。


推荐阅读