获取 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
我一直在努力解决一个看似简单但却让我难以理解的问题。 我正在处理比特币上的 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