Versionamento de queries para o BigQuery, herdadas do repositório https://github.com/RJ-SMTR/maestro
Crie um virtualenv e instale as dependências:
conda create -n maestro-bq
conda activate maestro-bq
pip install -r requirements.txt
Renderize uma query:
python helper/helper.py render <query-path>
Por exemplo:
python helper/helper.py render smtr/brt_rj_riodejaneiro_sigmob/data_versao_efetiva
A query renderizada será printada na tela e também será salva no seu clipboard. Para testar se ela compila, basta executá-la no BigQuery.
Você pode mudar os atributos descritos na próxima secão no arquivo helper/inner_params.yaml
.
run_key
: a chave montada no Dagster para essa execuçãorun_timestamp
: estampa de tempo dessa execução (exclusivo para cada execução de pipeline)maestro_sha
: hash do commit mais recente na branch default do repositório maestromaestro_bq_sha
: hash do commit mais recente na branch default do repositório maestro-bqdate_range_start
: inÃcio da janela de filtragem para backfill- Coincide com o
backfill.start_timestamp
do YAML na criação da tabela - Coincide com o timestamp da última execução nas outras execuções
- Coincide com o
date_range_end
: fim da janela de filtragem para backfill- Coincide com o timestamp do sensor (único para todas as RunRequests daquela execução do sensor)
- Tudo que estiver dentro da chave
parameters
do YAML, sem o prefixoparameters.*
- Exemplo: no YAML ->
parameters.interval = 2
, na query ->{{ interval }}
- Exemplo: no YAML ->
- Arquivo de query em
maestro-bq/materialized_views/br_rj_riodejaneiro_brt_gps/materialized_registros_tratada.sql
:
WITH box AS (
SELECT
*
FROM `rj-smtr.br_rj_riodejaneiro_geo.limites_geograficos_caixa`
)
SELECT
*,
{{ run_key }} AS run_key,
{{ run_timestamp }} AS run_timestamp,
{{ maestro_sha }} AS maestro_sha,
{{ maestro_bq_sha }} AS maestro_bq_sha,
FROM `rj-smtr.br_rj_riodejaneiro_brt_gps.registros`
WHERE DATETIME_DIFF(timestamp_captura, timestamp_gps, MINUTE) < {{ interval }}
AND timestamp_gps >= {{ date_range_start }}
AND timestamp_gps < {{ date_range_end }}
AND longitude BETWEEN (SELECT min_longitude FROM box) AND (SELECT max_longitude FROM box)
AND latitude BETWEEN (SELECT min_latitude FROM box) AND (SELECT max_latitude FROM box)
- Arquivo de configuração em
maestro-bq/materialized_views/br_rj_riodejaneiro_brt_gps/materialized_registros_tratada.yaml
:
# Definição de taxa de atualização
scheduling:
cron: "0/5 * * * *"
# Definição de particionamento
# - column: nome da coluna
# - type: deve ser um dos seguintes
# * DATE (não exige perÃodo)
# * DATE_TRUNC (exige perÃodo MONTH/YEAR)
# * DATETIME_TRUNC (exige perÃodo DAY/HOUR/MONTH/YEAR)
# * TIMESTAMP_TRUNC (exige perÃodo DAY/HOUR/MONTH/YEAR)
# * <To-do> RANGE_BUCKET
# * <To-do> GENERATE_ARRAY
# - period: perÃodo (conforme especificado acima)
partitioning:
column: "timestamp_gps"
type: "DATE"
period: ""
# Parâmetros da query
parameters:
interval: 2
# Parâmetros de backfill
backfill:
# Formato %Y-%m-%d %H:%M:%S
start_timestamp: "2021-01-01 00:00:00"
- Resultado: criação da tabela
br_rj_riodejaneiro_brt_gps.materialized_registros_tratada
que se materializa incrementalmente a cada 5 minutos e particionada diariamente emtimestamp_gps