使用带有自动模式检索的 LoadJobs 时如何处理 Avro 到 BigQuery 的类型转换

Posted

技术标签:

【中文标题】使用带有自动模式检索的 LoadJobs 时如何处理 Avro 到 BigQuery 的类型转换【英文标题】:How to deal with Avro to BigQuery type conversions when using LoadJobs with auto schema retrieval 【发布时间】:2021-10-01 15:11:15 【问题描述】:

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

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

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

Model schema (used when loading) Derived BigQuery type Schema (after export)
int INTEGER long
float FLOAT double
time-millis TIME time-micros
timestamp-millis TIMESTAMP timestamp-micros
map REPEATED RECORD array

fmpov 这个问题我只看到以下解决方案:

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

还有什么想法吗?

【问题讨论】:

您能否确认复制步骤是否为:1 - 加载 avro 架构 2- 从 BQ 导出 3- 那么数据类型不同? @JaimeLopez 是的,步骤是 1. 从 avro 容器文件加载作业 2. 从 BQ 导出作业。看起来像这样:gist.github.com/leozilla/2fb36fa3ec98face4fff5d1161c50a3a 【参考方案1】:

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

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

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

【讨论】:

以上是关于使用带有自动模式检索的 LoadJobs 时如何处理 Avro 到 BigQuery 的类型转换的主要内容,如果未能解决你的问题,请参考以下文章

从特定索引处的列表中检索值

如何通过带有本地容器注册表的 Docker 标签检索 SCDF 应用程序元数据?

正则表达式小结

使用 spring 和 hibernate 时,如何处理会话/事务?

如何从 SQLite 表中检索最后一个自动增量 ID?

如果 popstate 事件来自带有 HTML5 推送状态的后退或前进操作,我如何检索?