Загружать данные в BigQuery и разделять данные на основе времени, а также делить на другую переменную - PullRequest
0 голосов
/ 14 октября 2018

(Я очень плохо знаком с базами данных, поэтому, пожалуйста, дайте мне знать, как я могу улучшить этот вопрос.)

Я пытаюсь загрузить несколько файлов столбчатых данных в BigQuery изкорзина AWS S3

  • Это данные веб-аналитики более 150 различных веб-сайтов
  • Существует несколько файлов, каждый из которых содержит 15 минут данных веб-аналитики
  • Каждый файлсодержит данные для всех 150 веб-сайтов за 15-минутный интервал, однако есть столбец с именем site_code, в котором указывается, к какому сайту относится строка

Вот снимок соответствующих столбцов:

timestamp_info_nginx_ms site_code action
          1.539168e+12    site_1  event1
          1.539168e+12    site_2  event2
          1.539168e+12    site_3  event1
          1.539168e+12    site_1  event1
          1.539168e+12    site_2  event2

Размер данных составляет 200 + ГБ в неделю, и я хочу иметь возможность загружать данные за 12 недель.

Моя цель состоит в том, чтобы минимизировать ежемесячные затраты на запрос.

Некоторый контекст: Мой основной пример использования заключается в том, что я буду анализировать данные для одного веб-сайта (или группа веб-сайтов) одновременно.Из 150 сайтов я остановлюсь в основном на 10-15 сайтах.Давайте назовем их первичными сайтами .Я ожидаю, что буду анализировать первичные веб-сайты на регулярной основе (ежедневно) и остальные веб-сайты время от времени (1-3 раза в месяц) или редко (1-3 раза в 2 месяца).

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

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

1 Ответ

0 голосов
/ 01 ноября 2018

Посмотрев на недавно выпущенную функциональность BigQuery под названием кластеризация, это именно то, что я искал.Следующие строки кода решат мой вопрос, касающийся примера набора данных.

Для этого варианта использования я предполагаю, что данные хранятся в GCS и что это ndjson и сжатые файлы.

На момент публикации этого ответа невозможно создать кластеризованные таблицы через веб-интерфейс, поэтому я смотрю на параметр командной строки, устанавливая gcloud sdk.

Хотя можно создать многораздельную таблицу во время загрузки данных (как в случае создания таблицы и загрузки данных в нее можно одновременно), невозможно (на данный момент)одновременно создать кластеризованную таблицу.Следовательно, это двухэтапный процесс, где Шаг 1 - создание пустой таблицы;и шаг 2 - загрузить данные в него.

Учитывая мой примерный набор данных, моя схема будет выглядеть следующим образом:

 [
   {"type": "TIMESTAMP", "name": "timestamp_info_nginx_ms", "mode": "NULLABLE"},
   {"type": "STRING", "name": "site_code", "mode": "NULLABLE"},
   {"type": "STRING", "name": "action", "mode": "NULLABLE"}
  ]

Сохраните вышеуказанный json в текущем рабочем каталоге как myschema.json
Обратите внимание, что мой раздел будет сохраненметка времени и мои поля кластеризации будут код_сайта и действие.Порядок, в котором выполняется кластеризация, имеет значение.Помните порядок кластеризации, когда вы запускаете запросы для этого

Создайте набор данных в BigQuery с именем my-dataset.

Теперь вызовите команду gqoud sdk bq в своем терминале, чтобы создать таблицу.

bq mk -t --schema ./myschema.json --time_partitioning_type=DAY --time_partitioning_field timestamp_info_nginx_ms --require_partition_filter=TRUE --clustering_fields='site_code,action' my-dataset.my-clustered-table

Это должно создать новую таблицу my-clustertered-table в существующем наборе данных my-dataset.

Теперь загрузите данные в таблицу, используя команду bq gcloud sdk в вашемТерминал.

bq load --source_format=NEWLINE_DELIMITED_JSON --max_bad_records=1000 my-dataset.my-clustered-table gs://my-bucket/my-json-files/*

Это должно работать.

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