我一直在纠结于一个看似简单,但却让我难以理解的问题。我正在处理比特币上的公共BigQuery表,我想提取挖掘的每个块的第一个事务。换言之,将嵌套字段替换为其在表格预览中显示的第一行。没有字段可以标识它,只有它在表中存储的顺序。
我运行了following query
#StandardSQL
SELECT timestamp,
block_id,
FIRST_VALUE(transactions) OVER (ORDER BY (SELECT 1))
FROM `bigquery-public-data.bitcoin_blockchain.blocks`
但它在运行时会处理492 GB,并抛出以下错误:
Error: Resources exceeded during query execution: The query could not be executed in the allotted memory. Sort operator used for OVER(ORDER BY) used too much memory..
这看起来很简单,我一定是漏掉了什么。你有关于如何处理这样的任务的想法吗?
发布于 2018-06-25 02:45:47
#standardSQL
SELECT * EXCEPT(transactions),
(SELECT transaction FROM UNNEST(transactions) transaction LIMIT 1) transaction
FROM `bigquery-public-data.bitcoin_blockchain.blocks`
推荐:当使用像这样的大桌子时-我建议创建它的较小版本-这样你的开发/测试就会产生更少的成本。下面的代码可以帮助你做到这一点--你可以在带有目标表的BigQuery UI中运行它,然后你就可以在你的开发中使用它了。确保设置了Allow Large Results
和取消设置了Flatten Results
,以便保留原始模式
#legacySQL
SELECT *
FROM [bigquery-public-data:bitcoin_blockchain.blocks@1529518619028]
1529518619028
的值来自以下查询(在运行时)-我四天前使用的原因是,我知道这个表中的行数只有912,而不是当前的528,858
#legacySQL
SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -24*4, 'HOUR')/1000)
发布于 2018-06-27 04:45:38
Mikhail的另一种方法:只需使用[OFFSET(0)]
请求数组的第一行
#StandardSQL
SELECT timestamp,
block_id,
transactions[OFFSET(0)] first_transaction
FROM `bigquery-public-data.bitcoin_blockchain.blocks`
LIMIT 10
数组中的第一行仍然有一些嵌套数据,您可能也希望将这些数据展平到它们的第一行:
#standardSQL
SELECT timestamp
, block_id
, transactions[OFFSET(0)].transaction_id first_transaction_id
, transactions[OFFSET(0)].inputs[OFFSET(0)] first_transaction_first_input
, transactions[OFFSET(0)].outputs[OFFSET(0)] first_transaction_first_output
FROM `bigquery-public-data.bitcoin_blockchain.blocks`
LIMIT 1000
https://stackoverflow.com/questions/51012204
复制相似问题