Распределение данных по различным таблицам BigQuery - PullRequest
0 голосов
/ 28 февраля 2020

Мое приложение генерирует один файл журнала каждые 3 минуты на сервер с различными типами событий. Мне нужно перенести данные в BigQuery в различные таблицы более 100, в зависимости от типов событий.

В настоящее время мы запускаем собственный процесс ETL, который разбивает исходный файл на N файлов с последующим вводом данных, но мы хотим замените его чем-нибудь более легким.

Сначала я думал о загрузке данных во временную таблицу, а затем о выполнении N запросов, копирующих данные в целевую таблицу на основе типа события источника. Но при ежедневной загрузке 30 ТБ выполнение более 100 запросов к одному и тому же источнику может быть дорогостоящим.

Я не могу использовать раздел для рассматриваемых более 100 таблиц, поскольку мы используем декоратор временного диапазона с различными рабочими процессами ETL для постепенного сокращения данные.

1 Ответ

0 голосов
/ 28 февраля 2020

Загрузка данных во временную таблицу с последующими запросами, распределяющими данные по различным таблицам, выглядит как одна жизнеспособная опция, при условии, что ваша временная таблица разделена и кластеризована в полях, используемых в распределении предложения where Если тип вашего события - число, которое вы можете рассмотреть используя целочисленное разбиение диапазона, как предложено @Yun Zhang.

В качестве альтернативы, вы можете использовать BqTail Big Query data loader and преобразователь. В этом случае рабочий процесс приема данных будет выглядеть следующим образом:

myrule.yaml

When:
  Prefix: "/logs/"
  Suffix: ".avro"
Async: true
Batch:
  Window:
    DurationInSec: 90
Dest:
  Prefix: /logs/
  Pattern: '/logs/.+/(\d{4})/(\d{2})/(\d{2})/.+'
  Parameters:
    - Name: TableSuffix
      Expression: $1$2$3
  Table: myproject:mydataset.logs_${TableSuffix}
  Transient:
    Dataset: temp
  Schema:
    Template: 'myproject:mydataset.template'
    Split:
      ClusterColumns:
        - eventType
        - nested.otherColumn
      Mapping:
        - When: eventType in (1,2) AND nested.otherColumn > 0
          Then: myproject:mydataset.logs_xxx_${TableSuffix}
        - When: eventType in (3,4) AND nested.otherColumn > 0
          Then: myproject:mydataset.logs_yy_${TableSuffix}
        - When: nested.otherColumn == 0
          Then: myproject:mydataset.logs_zz_${TableSuffix}
OnSuccess:
  - Action: delete

Этот рабочий процесс можно использовать для запуска BqTail в автономном режиме

bqtail -r=myrule.yaml -s=someDataURL -X

или используйте правило в режиме без сервера BqTail, где каждый файл, загружаемый в Google Storage, запускает событие для процесса BqTail.

Наконец, вы можете найти ' Загрузка и преобразование данных в BigQuery в масштабе 'удобно.

...