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

时间:2018-06-24 17:14:20

标签: sql google-bigquery standard-sql

我一直在努力解决一个似乎很简单但又难以理解的问题。 我正在处理有关比特币的公共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..

这看起来很简单,我一定缺少一些东西。您对如何处理此类任务有想法吗?

2 个答案:

答案 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