Python Google BigQuery总和返回错误结果

Python Google BigQuery总和返回错误结果,python,pandas,google-bigquery,Python,Pandas,Google Bigquery,伙计们,我在公共区块链数据上运行这个查询,以获得全部烧掉的代币。但SUM返回的结果远小于real(不使用SUM运行相同的查询,并在Pandas中运行SUM)。它给出了8306条,而熊猫给出了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

伙计们,我在公共区块链数据上运行这个查询,以获得全部烧掉的代币。但SUM返回的结果远小于real(不使用SUM运行相同的查询,并在Pandas中运行SUM)。它给出了8306条,而熊猫给出了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')
选择
总和(安全系数(对数数据为INT64)/功率(10,18))
从…起
`bigquery公共数据。以太坊区块链。日志`作为日志
哪里是真的
和log.address='0xf53ad2c6851052a81b42133467480961b2321c09'
和log.block_时间戳>='2018-01-01 00:00:01'

和log.block\u timestamp问题在于,一些
log.data
值被排除在
总和
之外,因为它们不适合
INT64
的范围,因此
安全转换(log.data为INT64)
返回
NULL
。例如,
0x00000000000000000000000000000000000000000080B7978DA47C78D2
大于
9223372036854775807
的最大
INT64
值,即十六进制
0x7fffffffffffffffffffff

您可以改为将
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')
选择
总和(CAST(对数数据为浮点64)/POW(10,18))
从…起
`bigquery公共数据。以太坊区块链。日志`作为日志
哪里是真的
和log.address='0xf53ad2c6851052a81b42133467480961b2321c09'
和log.block_时间戳>='2018-01-01 00:00:01'

和log.block\u timestamp问题在于,一些
log.data
值被排除在
总和
之外,因为它们不适合
INT64
的范围,因此
安全转换(log.data为INT64)
返回
NULL
。例如,
0x00000000000000000000000000000000000000000080B7978DA47C78D2
大于
9223372036854775807
的最大
INT64
值,即十六进制
0x7fffffffffffffffffffff

您可以改为将
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')
选择
总和(CAST(对数数据为浮点64)/POW(10,18))
从…起
`bigquery公共数据。以太坊区块链。日志`作为日志
哪里是真的
和log.address='0xf53ad2c6851052a81b42133467480961b2321c09'
和log.block_时间戳>='2018-01-01 00:00:01'

和log.block_timestamp是不是谷歌可能会尝试本地化时间戳列(
log.block_timestamp
),这将导致另一组?是不是谷歌可能会尝试本地化时间戳列(
log.block_timestamp
),这将导致另一组?