我一直在努力解决一个似乎很简单但又难以理解的问题。 我正在处理有关比特币的公共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..
这看起来很简单,我一定缺少一些东西。您对如何处理此类任务有想法吗?
答案 0 :(得分:3)
#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 < / p>
#legacySQL
SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -24*4, 'HOUR')/1000)
答案 1 :(得分:1)
米哈伊尔(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