繁体   English   中英

如何从 Java 中的 bigquery 读取字节类型?

[英]How to read bytes type from bigquery in Java?

我们在 Scala 中有一个遗留数据流作业,它基本上从 Bigquery 读取数据,然后将其转储到 Postgres 中。
在 Scala 中,我们从 bigquery 读取数据,将其映射到一个案例类,然后将其转储到 Postgres 中,它也非常适合 bigquery 的Bytes类型。
我们从 BQ 读入的 Schema 在 Scala 中有一个Array[Byte]字段,我们使用.setBytes函数将其转储到相关Bytea列中的 postgres 表中。

现在我们将该工作迁移到 Java,这次我们不使用类型案例类,并且从 bigquery 读取返回为com.google.api.services.bigquery.model.TableRow对象,对于所有其他字段类型,它按预期工作但我对Bytes类型有疑问。

当我做

insetQuery.setBytes(3, row.get('bytes_type_column'))

它说setBytes列需要字节,而row.get('bytes_type_column')是一个对象。 现在,如果我执行row.get('bytes_type_column').toString().getBytes() ,它工作正常,但似乎原始字节列的内容已更改,从 Postgres 读取后我无法使用它。
在我看来, .toString()弄乱了字节并更改为一些 Java 字符串,将其转换为字节弄乱了原始形式。

我尝试的另一种方法是

insetQuery.setBytes(3, (byte[])row.get('bytes_type_column'))

这似乎也改变了专栏的内容。
当我尝试这个答案时遇到了同样的问题。

我几乎没有使用 Java 的经验,有人可以在这里指导我如何在不更改任何内容的情况下将我读取的 BQ 字节列值转储到 Postgres 中吗? 谢谢。

如果它对任何人都有帮助,BQ 的字节列实际上是一个pickled python 对象,我想将其转储到 Postgres 中,然后在读取 Python 应用程序后 unpickle,如果它没有被 unpickled,则意味着它没有被转储,因为它是.

在互联网上四处寻找解决方案并深入研究官方存储库和示例后,我终于在这里找到了解决方案。

基本上,您必须首先执行此操作:

byte[] bytes_type_column = Base64.getDecoder().decode((String) row.get("bytes_type_column"));

然后将其添加到您的查询中

insetQuery.setBytes(3, bytes_type_column)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM