Google BigQuery Sum 返回错误的结果

Posted

技术标签:

【中文标题】Google BigQuery Sum 返回错误的结果【英文标题】:Google BigQuery Sum return wrong result 【发布时间】:2018-10-22 14:53:13 【问题描述】:

我正在对公共区块链数据运行此查询,以获取已销毁的代币总数。但是 SUM 返回的结果比真实的要少得多(在 Pandas 中运行没有 sum 的相同查询并运行 sum)。它给出 8306 而 pandas 328608。

log.data - 十六进制数

SELECT
  SUM(SAFE_CAST(log.data as INT64)/POW(10,18))
FROM
  `bigquery-public-data.ethereum_blockchain.logs` AS log
WHERE TRUE
  AND log.address = '0xf53ad2c6851052a81b42133467480961b2321c09'
  AND log.block_timestamp >= '2018-01-01 00:00:01'
  AND log.block_timestamp <= '2018-12-01 00:00:01'
  AND SUBSTR(log.topics[SAFE_OFFSET(0)], 1, 10) IN ('0x42696c68','0xcc16f5db')

我不太明白为什么会发生这种情况。将不胜感激)

【问题讨论】:

会不会是 Google 尝试本地化时间戳列 (log.block_timestamp) 会导致另一个集合? 【参考方案1】:

问题是一些log.data 值被排除在SUM 之外,因为它们不适合INT64 的范围,因此SAFE_CAST(log.data AS INT64) 返回NULL。例如,0x00000000000000000000000000000000000000000000000080b7978da47c78d2 大于9223372036854775807 的最大INT64 值,即十六进制的0x7FFFFFFFFFFFFFFF

您可以改为将 log.data 值转换为 FLOAT64 类型,这会产生更接近您使用 Pandas 看到的结果:

SELECT
  SUM(CAST(log.data as FLOAT64)/POW(10,18))
FROM
  `bigquery-public-data.ethereum_blockchain.logs` AS log
WHERE TRUE
  AND log.address = '0xf53ad2c6851052a81b42133467480961b2321c09'
  AND log.block_timestamp >= '2018-01-01 00:00:01'
  AND log.block_timestamp <= '2018-12-01 00:00:01'
  AND SUBSTR(log.topics[SAFE_OFFSET(0)], 1, 10) IN ('0x42696c68','0xcc16f5db')

这将返回329681.7942642243

【讨论】:

以上是关于Google BigQuery Sum 返回错误的结果的主要内容,如果未能解决你的问题,请参考以下文章

使用 SUM 过滤结果时,Google BigQuery 相关子查询错误

Google BigQuery getQueryResults 为有效的作业 ID 返回 404 错误

在 Google bigquery 中加入 3 个表

在适用于 PHP 的 Google BigQuery API 中捕获“响应太大而无法返回错误”的正确方法是啥?

使用 Google BigQuery 执行查询期间超出资源

Google BigQuery - 根据另一列中的值减去一列的 SUM