Данные и машинное обучение — Примеры

Пример 1 — Счёт за запрос следует за прочитанными столбцами

Таблица событий хранится по строкам и запрашивается по времени, пользователю и сумме, а тот же движок ещё и работает непрерывно, независимо от того, запрашивает ли его кто-нибудь. Объявите хранилище, которое позволяет запросу из трёх столбцов прочитать три столбца, и скажите, что произойдёт со стоимостью движка.

таблица: events (хранится по строкам; каждый запрос читает всю запись)
запрос:  select user_id, date(event_time), sum(amount)
         from events group by user_id, date(event_time)

Решение

resource "google_bigquery_table" "events" {
  dataset_id = "<analytics-dataset>"
  table_id   = "events"

  # хранение по столбцам: этот запрос читает только event_time, user_id и amount
  clustering = ["user_id"]
  time_partitioning { type = "DAY" }
}

Хранимый по столбцам, тот же запрос читает три названных поля вместо всей полезной нагрузки в каждой подходящей строке, поэтому прочитанные байты — и следующий за ними счёт — падают на порядок. Хранение данных в долговечном дешёвом объектном хранилище с оплатой движка запросов только во время работы означает, что простаивающий склад стоит почти ничего. Обычная ошибка — держать аналитические данные в строчном хранилище, куда уже пишет приложение, потому что это хранилище появилось первым.

Пример 2 — Конвейер, который завершился успешно и загрузил ничего

Ночное задание обновляет данные, по которым переобучается настроенная модель. В некоторые ночи исходный раздел пуст, а задание всё равно завершается успешно, поэтому модель снова обучается на вчерашних данных. Добавьте проверку, которая ловит отказ данных, а не отказ задания.

# ночная загрузка, код выхода 0 независимо от содержимого раздела
load <events-partition> --date yesterday
echo "load ok"

Решение

set -euo pipefail
load <events-partition> --date yesterday
rows=$(count <events-partition> --date yesterday)
test "$rows" -gt 0 || { echo "вчерашний раздел пуст"; exit 1; }

Проверка теперь утверждает свежесть и форму данных, поэтому пустой раздел валит запуск и сообщает владельцу набора данных, вместо того чтобы устаревшая таблица отдавалась, пока кто-нибудь не заметит. Настроенная модель этого не покрывает: зависимости конвейера отказывают поздно и тихо, а код возврата задания ничего не говорит о том, что оно создало. Обычная ошибка — оповещать только о падениях и считать зелёный запуск доказательством свежих данных.