Sobre uma tabela incremental
O Dataform atualiza as tabelas de maneira diferente com base no tipo de tabela. Durante cada execução de uma tabela ou visualização, o Dataform recria toda a tabela ou visualização do zero.
Quando você define uma tabela incremental, o Dataform cria a tabela incremental do zero apenas pela primeira vez. Durante as execuções subsequentes, o Dataform insere ou mescla apenas novas linhas na tabela incremental de acordo com as condições que você configurar.
O Dataform insere novas linhas apenas em colunas que já existem na tabela incremental. Se você fizer alterações na consulta de definição de tabela incremental, por exemplo, adicionar uma nova coluna, será necessário recriar a tabela do zero. Para fazer isso, na próxima vez que você acionar uma execução da tabela, selecione a opção Executar com atualização completa.
Veja alguns casos de uso comum para tabelas incrementais:
Otimização de desempenho
Para alguns tipos de dados, como registros da Web ou dados de análise, convém processar apenas novos registros em vez de reprocessar a tabela inteira.
Redução da latência
É possível usar tabelas incrementais para executar fluxos de trabalho de maneira rápida, mas frequente, reduzindo a latência downstream das tabelas de saída.
Snapshots diários
É possível configurar uma tabela incremental para criar snapshots diários dos dados da tabela, por exemplo, para análise longitudinal de configurações do usuário armazenadas em um banco de dados de produção.
Antes de começar
No Console do Cloud, acesse a página Dataform.
Selecione ou crie um repositório.
Selecione ou crie um espaço de trabalho de desenvolvimento.
Crie uma tabela do tipo
incremental
.
Funções exigidas
Para conseguir as permissões necessárias para configurar uma tabela incremental, peça ao administrador para conceder a você o papel de Editor do Dataform (roles/dataform.editor
) nos espaços de trabalho.
Para mais informações sobre como conceder papéis, consulte Gerenciar acesso.
Também é possível conseguir as permissões necessárias por meio de papéis personalizados ou outros papéis predefinidos.
Processar um subconjunto de linhas em uma tabela incremental
Para determinar um subconjunto de linhas a serem processadas pelo Dataform durante cada execução, adicione uma cláusula WHERE
condicional ao arquivo de definição do SQLX da tabela incremental.
Para configurar uma tabela incremental, siga estas etapas:
- Acesse seu espaço de trabalho de desenvolvimento.
- No painel Files, expanda
definitions/
. - Abra um arquivo SQLX de definição de tabela incremental.
- Insira uma cláusula
WHERE
no seguinte formato:
config { type: "incremental" }
SELECT_STATEMENT
${when(incremental(), `WHERE CONDITION FROM ${self()}`) }
- Substitua SELECT_STATEMENT pela instrução
SELECT
que define sua tabela. - Substitua CONDITION pela condição da cláusula
WHERE
que seleciona linhas para o Dataform processar durante a execução da tabela.
A exemplo de código a seguir mostra uma tabela incremental que processa linhas de forma incremental da tabela productiondb.logs
:
config { type: "incremental" }
SELECT timestamp, message FROM ${ref("productiondb", "logs")}
${when(incremental(), `WHERE timestamp > (SELECT MAX(timestamp) FROM ${self()})`) }
A exemplo de código a seguir mostra uma tabela incremental que cria um snapshot da tabela productiondb.customers
:
config { type: "incremental" }
SELECT CURRENT_DATE() AS snapshot_date, customer_id, name, account_settings FROM ${ref("productiondb", "customers")}
${when(incremental(), `WHERE snapshot_date > (SELECT MAX(snapshot_date) FROM ${self()})`) }
Mesclar linhas em uma tabela incremental
Para garantir que a tabela incremental contenha apenas uma linha correspondente a uma combinação de colunas selecionada, defina as colunas selecionadas como uniqueKey
para mesclar as linhas com a mesma uniqueKey
. Ao atualizar a tabela, o Dataform mescla linhas com uniqueKey
em vez de anexá-las.
Para configurar a mesclagem em uma tabela incremental, siga estas etapas:
- Acesse seu espaço de trabalho de desenvolvimento.
- No painel Files, expanda
definitions/
. - Selecione um arquivo SQLX de definição de tabela incremental
- No bloco
config
, defina as colunas selecionadas comouniqueKey
no seguinte formato:
uniqueKey: ["COLUMN_NAME"]
Substitua COLUMN_NAME pelo nome de uma coluna selecionada.
A exemplo de código a seguir mostra uma tabela incremental com a coluna transaction_id
definida como uniqueKey
para garantir que ela sempre contenha uma linha:
config {
type: "incremental",
uniqueKey: ["transaction_id"]
}
SELECT timestamp, action FROM weblogs.user_actions
${ when(incremental(), `WHERE timestamp > (SELECT MAX(timestamp) FROM ${self()})`) }
Filtrar linhas em uma tabela incremental
Em uma tabela particionada incremental, para evitar que o Dataform verifique a tabela inteira para encontrar linhas correspondentes, defina updatePartitionFilter
para considerar apenas um subconjunto de registros.
O exemplo de código a seguir mostra uma tabela particionada incremental com mesclagem configurada definindo as propriedades uniqueKey
e updatePartitionFilter
:
config {
type: "incremental",
uniqueKey: ["transaction_id"],
bigquery: {
partitionBy: "DATE(timestamp)",
updatePartitionFilter:
"timestamp >= timestamp_sub(current_timestamp(), interval 24 hour)"
}
}
SELECT timestamp, action FROM weblogs.user_actions
${ when(incremental(), `WHERE timestamp > (SELECT MAX(timestamp) FROM ${self()})`) }
Evitar verificações de tabela completas ao ingerir de uma tabela particionada
Ao criar uma tabela incremental que faz referência a uma tabela particionada, recomendamos que você crie sua consulta de tabela para evitar verificações completas da tabela particionada durante cada atualização incremental.
É possível limitar o número de partições que o BigQuery verifica para atualizar a tabela incremental usando uma expressão constante na consulta de tabela. Para transformar um valor da tabela particionada em uma expressão constante, use o script do BigQuery para declarar o valor como uma variável no bloco pre_operations
.
Em seguida, use a variável como uma expressão constante em uma cláusula WHERE
na consulta SELECT
.
Com essa configuração, o Dataform atualiza a tabela incremental com base nas partições mais recentes da tabela particionada referenciada, sem verificar toda a tabela.
Para configurar uma tabela incremental que faz referência a uma tabela particionada e evita verificações completas de tabelas, siga estas etapas:
- Acesse seu espaço de trabalho de desenvolvimento.
- No painel Files, expanda
definitions/
. - Selecione um arquivo SQLX de definição de tabela incremental
- No bloco
pre_operations
, declare uma variável com script do BigQuery. - Filtre a instrução
SELECT
que define a tabela com uma cláusulaWHERE
que faça referência à variável declarada.
A exemplo de código a seguir mostra uma tabela incremental em que a tabela raw_events
referenciada é particionada por event_timestamp
:
config {
type: "incremental",
}
pre_operations {
DECLARE event_timestamp_checkpoint DEFAULT (
${when(incremental(),
`SELECT max(event_timestamp) FROM ${self()}`,
`SELECT timestamp("2000-01-01")`)}
)
}
SELECT
*
FROM
${ref("raw_events")}
WHERE event_timestamp > event_timestamp_checkpoint
No exemplo de código anterior, a variável event_timestamp_checkpoint
é definida no bloco pre_operations
.
Em seguida, a variável event_timestamp_checkpoint
é usada como uma expressão constante na cláusula WHERE
.
Recriar uma tabela incremental do zero com a atualização completa
É possível forçar uma tabela incremental a ser recriada do zero usando a interface de linha de comando com a opção --full-refresh
ou a opção Executar com atualização completa ao acionar uma execução de fluxo de trabalho.
Quando você seleciona a opção de atualização completa, no espaço de trabalho de desenvolvimento ou usando a CLI do Dataform, o Dataform ignora o parâmetro ${when(incremental(), ... }
durante a execução e recria a tabela com uma instrução CREATE OR REPLACE
.
Proteger uma tabela incremental contra a atualização completa
Para evitar que uma tabela incremental seja recriada do zero e que ocorra perda de dados, defina a tabela incremental como protected
. Talvez você queira impedir que uma tabela incremental seja recriada se a fonte de dados for temporária.
Para marcar uma tabela incremental como protected
, siga estas etapas:
- Acesse seu espaço de trabalho de desenvolvimento.
- No painel Files, expanda
definitions/
. - Selecione um arquivo SQLX de definição de tabela incremental.
- No bloco
config
, digiteprotected: true
.
O exemplo de código a seguir mostra uma tabela incremental marcada como protected
:
config {
type: "incremental",
protected: true
}
SELECT ...
A seguir
- Para saber como definir uma tabela, consulte Criar uma tabela.
- Para saber como usar a interface de linha de comando do Dataform, consulte Usar a CLI do Dataform.
- Para saber como acionar execuções manualmente, consulte Acionamento de execução.