通过 Dataflow Java API 返回客户端的不一致 BigQuery 数据类型
Posted
技术标签:
【中文标题】通过 Dataflow Java API 返回客户端的不一致 BigQuery 数据类型【英文标题】:Inconsistent BigQuery datatypes returned client side via Dataflow Java API 【发布时间】:2015-03-20 11:14:21 【问题描述】:给定 BigQuery 表:
以及以下客户端代码:
private void testTypes(Iterable<TableRow> table)
for(TableRow tr: table)
Object x = tr.get("an_integer");
Object y = tr.get("a_float");
Object z = tr.get("a_string");
System.out.println(x.getClass().getTypeName());
System.out.println(y.getClass().getTypeName());
System.out.println(z.getClass().getTypeName());
它产生:
java.lang.String
java.lang.Double
java.lang.String
为什么为 INTEGER 返回一个字符串?
为什么为 FLOAT 返回 Double?
【问题讨论】:
我可以为 FLOAT 回答 DOUBLE - 这只是一个术语。在 BigQuery 中,FLOAT 表示 64 位浮点数(在许多其他商业数据库中相同),在 Java 中,Double 表示 64 位浮点数。 我可以回答 STRING 的 INTEGER 问题。某些语言(javascript)将所有数字表示为浮点数,这意味着并非所有 64 位整数都可以表示。为了避免这种意外的舍入,INTEGER 在连线时总是被引用。这导致它们在 Java 中显示为字符串。 【参考方案1】:您似乎有两个 cmets 解释该行为。我会将它们复制到这里,以便为您的问题提供真正的答案
来自Mosha Pasumansky:
“我可以为 FLOAT 回答 DOUBLE - 它只是一个术语。在 BigQuery 中,FLOAT 表示 64 位浮点数(在许多其他商业数据库中相同),而在 Java 中,Double 表示 64 位浮点数。”
来自Michael Sheldon: " 我可以回答 STRING 的 INTEGER 问题。某些语言 (Javascript) 将所有数字表示为浮点数,这意味着并非所有 64 位整数都可以表示。为了避免这种意外舍入,在线路上总是引用 INTEGER。这导致它们在 Java 中显示为 String"
【讨论】:
以上是关于通过 Dataflow Java API 返回客户端的不一致 BigQuery 数据类型的主要内容,如果未能解决你的问题,请参考以下文章
TableRow 对象未在 dataFlow 作业中返回记录类型列
Scio:Apache Beam和Google Cloud Dataflow的Scala API
如何在私有子网上从 python Google API 客户端库运行数据流