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

Get the first row of a nested field in BigQuery

我一直在努力解决一个看似简单但却让我难以理解的问题。 我正在处理比特币上的 public BigQuery table,我想提取每个已开采区块的第一个 t运行saction。换句话说,用 table 预览中显示的第一行替换嵌套字段。没有字段可以识别它,只有它存储在 table.

中的顺序

我运行 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..

看起来很简单,我一定是漏掉了什么。你知道如何处理这样的任务吗?

#standardSQL
SELECT * EXCEPT(transactions),
  (SELECT transaction FROM UNNEST(transactions) transaction LIMIT 1) transaction
FROM `bigquery-public-data.bitcoin_blockchain.blocks`    

建议:在玩像这样的大型 table 时 - 我建议创建较小的版本 - 这样 dev/test 的成本就会降低。下面可以帮助解决这个问题——你可以在 BigQuery UI 中 运行 它的目的地 table 然后你将用于你的开发。确保设置 Allow Large Results 并取消设置 Flatten Results 以便保留原始架构

#legacySQL
SELECT *
FROM [bigquery-public-data:bitcoin_blockchain.blocks@1529518619028]     

1529518619028 的值取自下面的查询(在 运行ning 的时间)——我四天前取的原因是我知道这个 [=21] 中的行数=] 那个时间只有 912 vs 现在的 528,858

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

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