BigQuery COALESCE/IFNULL 类型与文字不匹配

Posted

技术标签:

【中文标题】BigQuery COALESCE/IFNULL 类型与文字不匹配【英文标题】:BigQuery COALESCE/IFNULL type mismatch with literals 【发布时间】:2016-02-11 20:20:10 【问题描述】:

在 SQL 中,当我的查询包含像 COUNTSUM 这样的聚合函数时,我通常使用 COALESCEIFNULL 来确保获得数字而不是 NULL,例如:

SELECT IFNULL(COUNT(foo), 0) AS foo_count FROM …

但是,在 BigQuery 中我遇到了一个错误:

函数 IFNULL 中的参数类型不匹配:“f0_”是 uint64 类型,“0”是 int32 类型。

有没有办法让 BigQuery 理解在这种情况下文字 0 应该被解释为 unit64

我尝试过使用CAST,但没有unit64 类型可以转换,所以我尝试INTEGER

SELECT IFNULL(COUNT(foo), CAST(0 AS INTEGER)) AS foo_count FROM …

这给了我基本相同的错误,但至少我成功地得到了 64 位零而不是 32 位:

函数 IFNULL 中的参数类型不匹配:“f0_”是 uint64 类型,“0”是 int64 类型。

如果我使用INTEGER(0),也会发生同样的情况。

如果我将两个参数都转换为INTEGER,我可以让它工作:

SELECT IFNULL(INTEGER(COUNT(foo)), INTEGER(0)) AS foo_count FROM …

但现在它开始变得冗长了。这真的是您在 BigQuery 中应该这样做的方式吗?

【问题讨论】:

您应该只需要在您的COUNT 周围加上INTEGER,对吗?仍然不理想,因为隐式转换对引擎来说应该很容易,但事实如此......顺便说一句,这也可能会带来一些启示:***.com/questions/11059778/… 是的,不知道为什么我没有考虑到这一点,但仍然没有必要。感谢您的链接 - 似乎该错误已经有一段时间没有修复了 :) 这些错误报告似乎相关 (1) code.google.com/p/google-bigquery/issues/detail?id=121 , (2) code.google.com/p/google-bigquery/issues/detail?id=375 @KinaanKhanSherwani 谢谢,我必须留意那些报告中提到的修复。 在什么情况下COUNT 会返回 NULL 而不是 0? 【参考方案1】:

这是 BigQuery 中的一个错误,已经存在了很长一段时间。暂时你需要强制转换COUNT,但你不应该为你的“0”做它。

以下应该有效:

SELECT IFNULL(INTEGER(COUNT(foo)), 0) AS foo_count FROM

感谢@Kinaan Khan Sherwani 提供official bug report 的链接。

【讨论】:

将两者都转换为 BIGINT 不是更好吗,考虑到 BigQuery/BigData,21 亿并不是一个大数字? 我不相信 Bigquery 具有“BIGINT”数据类型。只是 64 位整数。我不太使用它,所以我可能会弄错,但我相信原始海报发现了同样的东西。

以上是关于BigQuery COALESCE/IFNULL 类型与文字不匹配的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 传输与 BigQuery 负载

BigQuery - 获取 BigQuery 表中的总列数

数据处理 - BigQuery 与 Data Proc+BigQuery

BigQuery:写入查询结果时使用 bigquery 作业的意外行为

Google BigQuery - 将数据流式传输到 BigQuery

Python BigQuery 脚本 bigquery.jobs.create 错误