Sql 获取BigQuery中嵌套字段的第一行

Sql 获取BigQuery中嵌套字段的第一行,sql,google-bigquery,bigquery-standard-sql,Sql,Google Bigquery,Bigquery Standard Sql,我一直在努力解决一个看似简单却又难以回答的问题。 我正在处理比特币上的公共BigQuery表,我想提取挖掘的每个区块的第一笔交易。换句话说,用嵌套字段在表预览中显示的第一行替换嵌套字段。没有字段可以识别它,只有它在表中的存储顺序 我运行了以下命令: 但它在运行时处理492 GB,并抛出以下错误: Error: Resources exceeded during query execution: The query could not be executed in the allotted mem

我一直在努力解决一个看似简单却又难以回答的问题。 我正在处理比特币上的公共BigQuery表,我想提取挖掘的每个区块的第一笔交易。换句话说,用嵌套字段在表预览中显示的第一行替换嵌套字段。没有字段可以识别它,只有它在表中的存储顺序

我运行了以下命令:

但它在运行时处理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..
这看起来很简单,我一定错过了什么。你对如何处理这样的任务有什么想法吗

#standardSQL
SELECT * EXCEPT(transactions),
  (SELECT transaction FROM UNNEST(transactions) transaction LIMIT 1) transaction
FROM `bigquery-public-data.bitcoin_blockchain.blocks`    
建议:在使用像这样的大表时——我建议创建更小的版本——这样可以降低开发/测试的成本。下面有助于这一点-您可以在BigQuery UI中使用目标表运行它,然后将其用于您的开发。请确保设置
允许大结果
和取消设置
展平结果
,以便保留原始模式

#legacySQL
SELECT *
FROM [bigquery-public-data:bitcoin_blockchain.blocks@1529518619028]     
1529518619028
的值取自下面的查询(在运行时)-我四天前使用的原因是我知道该表中的行数当时只有912行,而当前的528858行

#legacySQL
SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -24*4, 'HOUR')/1000) 

Mikhail的另一种方法是:只需使用
[偏移量(0)]
请求数组的第一行:

数组中的第一行仍然有一些嵌套数据,您可能也希望将其展平为仅第一行:

#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

谢谢你,Mikhail,为开发人员制作一个时间窗口有限的单独表格的想法真的很好,一段时间以来我一直对缺乏限制扫描大小的方法感到沮丧。这可能就是为什么我忘记了限制的用法。这让我了解了,这将是有用的。谢谢你,菲利佩。这是一个非常有用的把戏!对于嵌套数据,coinbase的各种输出中实际上有有趣的信息,我希望保存这些信息。
#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