2018-10: BigQuery не поддерживает материализованных представлений , но вы можете использовать этот подход:
Допустим, вам нужна таблица с последней информацией для каждой строки, и выхотите, чтобы он обновлялся - чтобы каждый, кто запрашивает, мог легко получить доступ к последней строке, не просматривая всю таблицу только для добавления.
В этом примере я буду использовать мои кластеризованные журналы Википедии -и я создам таблицу с последними строками всех английских страниц, которые начинаются с 'A'.Эти ограничения делают мои запросы быстрее и меньше для этой демонстрационной цели.
Давайте сначала создадим таблицу:
CREATE TABLE `wikipedia_vt.just_latest_rows` AS
SELECT latest_row.*
FROM (
SELECT ARRAY_AGG(a ORDER BY datehour DESC LIMIT 1)[OFFSET(0)] latest_row
FROM `fh-bigquery.wikipedia_v3.pageviews_2018` a
WHERE datehour BETWEEN "2018-10-18" AND "2018-10-21"
AND wiki='en' AND title LIKE 'A%'
GROUP BY title
)
А теперь я хочу обновить ее всеми новыми строками, полученными с этой даты:
MERGE `wikipedia_vt.just_latest_rows` T
# our "materialized view"
USING (
SELECT latest_row.*
FROM (
SELECT ARRAY_AGG(a ORDER BY datehour DESC LIMIT 1)[OFFSET(0)] latest_row
FROM `fh-bigquery.wikipedia_v3.pageviews_2018` a
WHERE datehour > TIMESTAMP_SUB(@run_time, INTERVAL 1 DAY )
# change to CURRENT_TIMESTAMP() or let scheduled queries do it
AND datehour > '2000-01-01' # nag
AND wiki='en' AND title LIKE 'A%'
GROUP BY title
)
) S
ON T.title = S.title
WHEN MATCHED THEN
# if the row is there, we update the views and time
UPDATE SET views = S.views, datehour=S.datehour
WHEN NOT MATCHED BY TARGET THEN
# if the row is not there, we insert it
INSERT (datehour, wiki, title, views) VALUES (datehour, wiki, title, views)
Теперь вы должны настроить процесс для периодического выполнения этого запроса.Чтобы уменьшить количество запросов, убедитесь, что процесс изменяет дату начала обновлений.
Простой способ настроить этот процесс - использовать новые запланированные запросы BigQuery, которые заменят @run_time на текущую метку времени.
Чтобы создать представление, сочетающее этот подход с представлением последних записей в режиме реального времени, см .: