Получить первую строку вложенного поля в BigQuery - PullRequest
0 голосов
/ 24 июня 2018

Я боролся с вопросом, который кажется простым, но ускользает от меня.Я имею дело с общедоступной таблицей BigQuery для биткойнов, и я хотел бы извлечь первую транзакцию из каждого добытого блока.Другими словами, чтобы заменить вложенное поле его первой строкой, как это показано в предварительном просмотре таблицы.Нет поля, которое может идентифицировать его, только порядок, в котором он был сохранен в таблице.

Я выполнил следующий запрос :

#StandardSQL
SELECT timestamp,
    block_id,
    FIRST_VALUE(transactions) OVER (ORDER BY (SELECT 1))
FROM `bigquery-public-data.bitcoin_blockchain.blocks`

Но этообрабатывает 492 ГБ при запуске и выдает следующую ошибку:

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 голосов
/ 26 июня 2018

Альтернативный подход к Михаилу: просто спросите первый ряд массива с [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
0 голосов
/ 24 июня 2018
#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

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