通过 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 客户端库运行数据流

直接流式传输到 BigQuery 与通过 Google Pub/Sub + Dataflow 流式传输的优缺点

从 REST API 更新 Dataflow 作业

Dataflow API 不会在 GCP 中激活