Посмотрев на недавно выпущенную функциональность 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/*
Это должно работать.