Я хочу "материализованное представление" последних записей - PullRequest
0 голосов
/ 25 октября 2018

Поскольку я продолжаю добавлять строки в BigQuery, мне бы хотелось иметь «материализованное представление» последней строки для каждого идентификатора.

Как я могу это сделать?

1 Ответ

0 голосов
/ 25 октября 2018

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 на текущую метку времени.

Чтобы создать представление, сочетающее этот подход с представлением последних записей в режиме реального времени, см .:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...