BigQuery COALESCE/IFNULL 类型与文字不匹配
Posted
技术标签:
【中文标题】BigQuery COALESCE/IFNULL 类型与文字不匹配【英文标题】:BigQuery COALESCE/IFNULL type mismatch with literals 【发布时间】:2016-02-11 20:20:10 【问题描述】:在 SQL 中,当我的查询包含像 COUNT
和 SUM
这样的聚合函数时,我通常使用 COALESCE
和 IFNULL
来确保获得数字而不是 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 与 Data Proc+BigQuery
BigQuery:写入查询结果时使用 bigquery 作业的意外行为