2017-01-26 2 views
2

У нас есть таблица, разбитая по дням в BigQuery, которая обновляется потоковыми вставками.Как запросить данные в потоковом буфере ТОЛЬКО в BigQuery?

doc говорит, что: «при потоковой передаче в секционированной таблице, данные в буфере потокового имеет значение NULL для _PARTITIONTIME псевдо колонке»

Но если я запрашиваю для select count(*) from table where _PARTITIONTIME is NULL она всегда возвращает 0, хотя bq show говорит, что в потоковом буфере есть много строк.

Означает ли это, что псевдо-столбец вообще отсутствует для строк в потоковом буфере? В любом случае, как я могу запрашивать данные ТОЛЬКО в потоковом буфере, не становясь полным сканированием таблицы?

Заранее спасибо

+0

, что является практическим примером использования этого? я не думаю, что вы можете запросить/прочитать потоковый буфер, но если вы объясните, почему вы считаете, что вам нужно его прочитать, мы можем выяснить, как это сделать. –

+0

У меня есть потоковая работа, которая обновляет таблицу в BigQuery , У меня есть работа по нисходящему потоку, которая запускает каждые 15 минут и агрегирует данные за день до сих пор - так что ему нужно запросить что-то эквивалентное «где _PARTITIONTIME = сегодня ИЛИ data_in_streaming_buffer». Есть ли способ достичь этого? Благодарю. –

ответ

0

При потоковой передаче данных в Бк вы обычно имеете «разогрев» период, и это время, необходимое для поточных данных становятся доступными для таких операций, как запрашивающее, копирование и экспорт.

В конце документа указывается, что после периода до 90 минут псевдо-столбец _PARTITIONTIME получает ненулевое значение, что означает, что потоковые данные полностью готовы к любому типу операций, которые вы хотите запустить на данные (возможность запуска запросов обычно занимает несколько секунд).

Это означает, что вы не query partitioned tables искал, когда это поле равно нулю, но вместо этого, вы делаете так:

SELECT 
    fields 
FROM 
    `dataset.partitioned_table_name` 
WHERE 
    _PARTITIONTIME = TIMESTAMP('2017-01-20') 

В этом примере, вы бы запрашивая только данными, поступающими в даты раздела Jan/20 (что позволяет избежать полного сканирования таблицы).

Вы также можете выбрать для диапазона дат, вы просто должны изменить положение WHERE на:

WHERE _PARTITIONTIME BETWEEN TIMESTAMP('2017-01-20') AND TIMESTAMP('2017-01-22') 

Какой бы запрос в течение 2 дней в вашей таблице.

+0

Использование 'WHERE _PARTITIONTIME = TIMESTAMP (some_day)' не запрашивает потоковый буфер - если я запрашиваю последнюю запись с использованием временного поля в схеме, результат полного сканирования таблицы более чем на час более поздний, чем тот, где условие разделения –

Смежные вопросы