Este documento mostra como definir a relação entre objetos no seu fluxo de trabalho no Dataform declarando dependências.
Pode definir uma relação de dependência entre objetos de um fluxo de trabalho. Numa relação de dependência, a execução do objeto dependente depende da execução do objeto de dependência. Isto significa que o Dataform executa o dependente após a dependência. Pode definir a relação declarando dependências no ficheiro de definição SQLX do objeto dependente.
As declarações de dependências formam uma árvore de dependências do seu fluxo de trabalho que determina a ordem pela qual o Dataform executa as ações do fluxo de trabalho.
Pode definir a relação de dependência entre as seguintes ações do fluxo de trabalho:
- Declarações de origens de dados
- Declarações de origens de dados do BigQuery que lhe permitem referenciar estas origens de dados em definições de tabelas do Dataform e operações SQL. Pode definir uma declaração de origem de dados como uma dependência, mas não como um dependente.
- Tabelas
- Tabelas que cria no Dataform com base nas origens de dados declaradas ou noutras tabelas no seu fluxo de trabalho. O Dataform suporta os seguintes tipos de tabelas: tabela, tabela incremental, vista e vista materializada. Pode definir uma tabela como uma dependência e como um dependente.
- Operações SQL personalizadas
- Declarações SQL que o Dataform executa no BigQuery tal como estão, sem modificações. Pode definir uma operação SQL personalizada definida num ficheiro
type: operations
como uma dependência e como um dependente. Para declarar uma operação SQL personalizada como uma dependência na funçãoref
, tem de definir a propriedadehasOutput
comotrue
no ficheiro de definição SQLX da operação SQL personalizada. - Afirmações
- Consultas de teste de qualidade de dados que pode usar para testar dados de tabelas.
O Dataform executa validações sempre que atualiza o fluxo de trabalho e
envia-lhe um alerta se alguma validação falhar. Pode definir uma afirmação definida num ficheiro
type: assertion
como uma dependência e como um dependente declarando dependências no blococonfig
.
Pode definir a relação de dependência das seguintes formas:
- Declare uma dependência usando a função
ref
do Dataform core para referenciar a dependência numa declaraçãoSELECT
. - Declare uma lista de dependências no bloco
config
de um ficheiro de definição SQLX.
Antes de começar
- Crie e inicialize um espaço de trabalho de desenvolvimento no seu repositório.
- Opcional: declare uma origem de dados.
- Crie, pelo menos, duas ações do fluxo de trabalho: tabelas, afirmações, declarações de origens de dados ou operações.
Funções necessárias
Para receber as autorizações de que
precisa para declarar dependências para tabelas, afirmações, declarações de
origens de dados e operações SQL personalizadas,
peça ao seu administrador para lhe conceder a
função do IAM Editor do Dataform (roles/dataform.editor
) nos espaços de trabalho.
Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.
Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.
Declarar uma dependência como um argumento da função ref
Para referenciar e declarar automaticamente uma dependência numa declaração SELECT
,
adicione a dependência como um argumento da função ref
.
A função ref
é uma função integrada do Dataform core que lhe permite
fazer referência e depender automaticamente de qualquer tabela, declaração de origem de dados ou
operação SQL personalizada com a propriedade hasOutput
definida como true
no seu fluxo de trabalho.
Para mais informações acerca da função ref
, consulte a
referência de métodos do contexto principal do Dataform.
Para mais informações sobre a utilização da função ref
numa definição de tabela, consulte o artigo
Acerca das definições de tabelas.
O exemplo de código seguinte mostra a declaração da origem de dados source_data
adicionada
como um argumento da função ref
no ficheiro de definição incremental_table.sqlx
SQLX
de uma tabela incremental:
// filename is incremental_table.sqlx
config { type: "incremental" }
SELECT * FROM ${ref("source_data")}
No exemplo de código anterior, source_data
é declarado automaticamente como uma dependência de incremental_table
.
O exemplo de código seguinte mostra o ficheiro SQLX de definição da tabela some_table
adicionado
como um argumento da função ref
no ficheiro de definição SQLX de uma afirmação:custom_assertion.sqlx
// filename is custom_assertion.sqlx
config { type: "assertion" }
SELECT
*
FROM
${ref("some_table")}
WHERE
a is null
or b is null
or c is null
No exemplo de código anterior, some_table
é declarado automaticamente como uma dependência de custom_assertion
. Durante a execução, o Dataform executa some_table
primeiro e, em seguida, executa custom_assertion
assim que some_table
é criado.
Declare dependências no bloco config
Para declarar dependências que não são referenciadas na definição da declaração SQL do dependente, mas que têm de ser executadas antes da tabela, da afirmação ou da operação SQL personalizada, siga estes passos:
- No espaço de trabalho de desenvolvimento, no painel Ficheiros, expanda o diretório
definitions/
. - Selecione o ficheiro SQLX da tabela, da afirmação ou da operação SQL personalizada que quer editar.
No bloco
config
do ficheiro, introduza o seguinte fragmento do código:dependencies: [ "DEPENDENCY", ]
Substitua DEPENDENCY pela string de destino, por exemplo, o nome do ficheiro da ação que quer adicionar como dependência. Pode introduzir vários alvos, separados por vírgulas.
Opcional: clique em Formatar.
O exemplo de código seguinte mostra a tabela some_table
e a declaração some_assertion
adicionadas como dependências ao bloco config
de um ficheiro de definição de tabela:
config { dependencies: [ "some_table", "some_assertion" ] }
Defina afirmações como dependências
Quando a ação do fluxo de trabalho B depende da ação do fluxo de trabalho A, que tem asserções, a falha das asserções da ação A não impede o Dataform de executar a ação B. Para executar a ação B apenas se as afirmações da ação A forem aprovadas, tem de definir as afirmações da ação A como dependências da ação B.
Pode definir afirmações como dependências de uma ação selecionada das seguintes formas:
- Defina as afirmações selecionadas como dependências
Pode definir manualmente as afirmações selecionadas como dependências adicionando-as à linha
dependencies: [ "" ]
no blococonfig
da ação editada.Por exemplo, se a ação B depender da ação A e quiser que a ação B dependa apenas das afirmações selecionadas da ação A, pode adicionar essas afirmações selecionadas ao bloco
config
da ação B.Pode definir manualmente as afirmações selecionadas como dependências para todos os tipos de ações, exceto declarações de origens de dados.
- Defina as afirmações de uma ação de dependência selecionada como dependências
Pode definir o parâmetro
includeDependentAssertions
para definir automaticamente todas as afirmações diretas de uma ação de fluxo de trabalho de dependência selecionada como dependências da ação editada. O Dataform adiciona estas afirmações como dependências durante cada compilação da ação para verificar se as dependências estão atualizadas se as afirmações da ação de dependência mudarem.Por exemplo, se a ação C depender das ações A e B, mas quiser que a ação C dependa apenas das afirmações da ação A, pode editar a ação C e definir o parâmetro
includeDependentAssertions
para definir automaticamente todas as afirmações da ação A como dependências da ação C.Pode definir o parâmetro
includeDependentAssertions
para ações dos seguintes tipos:table
view
operations
- Defina as afirmações de todas as ações de dependência como dependências
Pode definir o parâmetro
dependOnDependencyAssertions
para definir automaticamente todas as afirmações diretas de todas as ações de dependência da ação editada como dependências adicionais da ação editada. O Dataform adiciona estas afirmações como dependências durante cada compilação da ação para verificar se as dependências estão atualizadas se as afirmações da ação de dependência mudarem.Por exemplo, se a ação C depender das ações A e B, pode editar a ação C e definir o parâmetro
dependOnDependencyAssertions
para definir automaticamente todas as afirmações das ações A e B como dependências da ação C.Pode definir o parâmetro
dependOnDependencyAssertions
para ações dos seguintes tipos:table
view
operations
Quando define o parâmetro dependOnDependencyAssertions
e os parâmetros includeDependentAssertions
num único ficheiro, o parâmetro includeDependentAssertions
tem prioridade. Por exemplo, se definir
dependOnDependencyAssertions
como true
, mas também definir
includeDependentAssertions
como false
para uma ação de dependência selecionada,
o Dataform não adiciona as afirmações dessa ação às dependências.
O exemplo de código seguinte mostra os parâmetros dependOnDependencyAssertions
e includeDependentAssertions
definidos no mesmo ficheiro de definição da tabela:
// filename is tableName.sqlx
config {
type: "table",
dependOnDependencyAssertions: true,
dependencies: [ "actionA", {name: "actionB", includeDependentAssertions: false} ]
}
SELECT * FROM ${ref("actionC")}
No exemplo de código anterior, o Dataform adiciona todas as afirmações diretas de actionA
e actionC
às dependências de tableName
durante a compilação.
Defina as afirmações selecionadas como dependências
Para executar uma ação de fluxo de trabalho apenas quando as afirmações selecionadas forem aprovadas, pode adicionar a afirmação selecionada à linha dependencies: [ "" ]
no bloco config
da ação editada.
Para definir uma afirmação selecionada como uma dependência de uma ação de fluxo de trabalho selecionada, siga estes passos:
- No espaço de trabalho de desenvolvimento, no painel Ficheiros, expanda
definitions/
. - Selecione um ficheiro SQLX de ação do fluxo de trabalho.
- No bloco
config
do ficheiro de ações, introduzadependencies: [ "" ]
. Em
dependencies: [ "" ]
, introduza o nome da declaração de ação ou o nome do ficheiro da declaração manual que quer definir como uma dependência num dos seguintes formatos:nonNull
config { type: "ACTION_TYPE", dependencies: [ "ACTION_DATASET_NAME_ACTION_NAME_assertions_nonNull"] }
Substitua o seguinte:
- ACTION_TYPE: o tipo de ação do fluxo de trabalho:
table
,view
ouoperations
. - ACTION_DATASET_NAME: o nome do conjunto de dados no qual a ação está definida. O conjunto de dados predefinido é definido no ficheiro de definições do fluxo de trabalho.
- ACTION_NAME: o nome da ação na qual a declaração está definida.
rowConditions
config { type: "ACTION_TYPE", dependencies: [ "ACTION_DATASET_NAME_ACTION_NAME_assertions_rowConditions"] }
Substitua o seguinte:
- ACTION_TYPE: o tipo de ação do fluxo de trabalho:
table
,view
ouoperations
. - DATASET_NAME: o nome do conjunto de dados no qual a ação está definida. O conjunto de dados predefinido é definido no ficheiro de definições do fluxo de trabalho.
- ACTION_NAME: o nome da ação na qual a afirmação está definida.
uniqueKey
config { type: "ACTION_TYPE", dependencies: [ "ACTION_DATASET_NAME_ACTION_NAME_assertions_uniqueKey_INDEX"] }
Substitua o seguinte:
- ACTION_TYPE: o tipo de ação do fluxo de trabalho:
table
,view
ouoperations
. - DATASET_NAME: o nome do conjunto de dados no qual a tabela está definida. O conjunto de dados predefinido é definido no ficheiro de definições do fluxo de trabalho.
- ACTION_NAME: o nome da tabela na qual a afirmação está definida.
- INDEX: o índice da matriz de chaves definida na declaração
uniqueKey
que quer adicionar como dependência, por exemplo,0
ou1
. Se apenas for definido um conjunto de chaves na declaração, o índice é0
.
uniqueKeys
config { type: "ACTION_TYPE", dependencies: [ "ACTION_DATASET_NAME_ACTION_NAME_assertions_uniqueKeys_INDEX"] }
Substitua o seguinte:
- ACTION_TYPE: o tipo de ação do fluxo de trabalho:
table
,view
ouoperations
. - DATASET_NAME: o nome do conjunto de dados no qual a tabela está definida. O conjunto de dados predefinido é definido no ficheiro de definições do fluxo de trabalho.
- ACTION_NAME: o nome da tabela na qual a afirmação está definida.
- INDEX: o índice da matriz de chaves definida na declaração
uniqueKeys
que quer adicionar como dependência, por exemplo,0
ou1
. Se apenas for definido um conjunto de chaves na declaração, o índice é0
.
afirmação manual
config { type: "ACTION_TYPE", dependencies: [ "MANUAL_ASSERTION_NAME"] }
Substitua o seguinte:
- ACTION_TYPE: o tipo de ação do fluxo de trabalho:
table
,view
ouoperations
. - MANUAL_ASSERTION_NAME o nome da declaração manual.
- ACTION_TYPE: o tipo de ação do fluxo de trabalho:
Para adicionar outra afirmação como uma dependência à tabela editada, repita o passo 4.
Opcional: clique em Formatar.
O seguinte exemplo de código mostra asserções adicionadas à tabela A, que está definida no conjunto de dados dataform
:
config {
type: "table",
assertions: {
uniqueKey: ["user_id"],
nonNull: ["user_id", "customer_id"],
}
}
O seguinte exemplo de código mostra as afirmações da tabela A adicionadas como dependências à tabela B:
config {
type: "table",
dependencies: [ "dataform_A_assertions_uniqueKey_0", "dataform_A_assertions_nonNull"]
}
O exemplo de código seguinte mostra uma declaração manual definida no ficheiro manualAssertion.sqlx
e adicionada como uma dependência a uma vista:
config {
type: "view",
dependencies: [ "manualAssertion"]
}
O exemplo de código seguinte mostra o ficheiro manual_assertion
e as
afirmações da tabela sometable
adicionadas como dependências a uma tabela:
config {
type: "table",
dependencies: [ "manual_assertion", "dataform_sometable_assertions_nonNull" , "dataform_sometable_assertions_rowConditions"]
}
SELECT * FROM ${ref("referenced_table")} LEFT JOIN ...
Defina as afirmações de uma ação selecionada como dependências
Para executar uma ação de fluxo de trabalho apenas quando todas as afirmações diretas de uma ação de dependência selecionada forem aprovadas, defina o parâmetro includeDependentAssertions
como true
na ação editada. O Dataform adiciona automaticamente as afirmações diretas da ação de dependência selecionada às dependências durante a compilação. O valor predefinido é false
.
Para definir todas as afirmações de uma ação de dependência selecionada como dependências, siga estes passos:
- No espaço de trabalho de desenvolvimento, no painel Ficheiros, expanda
definitions/
. - Selecione um ficheiro SQLX de ação do fluxo de trabalho.
No ficheiro, defina o parâmetro
includeDependentAssertions
comotrue
de uma das seguintes formas:No quarteirão
config
config { type: "ACTION_TYPE", dependencies: [{name: "dEPENDENCY_ACTION_NAME", includeDependentAssertions: true}] }
Substitua o seguinte:
- ACTION_TYPE: o tipo de ação do fluxo de trabalho:
table
,view
ouoperations
. - DEPENDENCY_ACTION_NAME: o nome da ação de dependência com as afirmações que quer definir como dependências da ação editada.
No extrato
SELECT
config { type: "ACTION_TYPE" } SELECT * FROM ${ref({name: "DEPENDENCY_ACTION_NAME", includeDependentAssertions: true})}
Substitua o seguinte:
- ACTION_TYPE: o tipo de ação do fluxo de trabalho:
table
,view
ouoperations
. - DEPENDENCY_ACTION_NAME: o nome da ação de dependência com as afirmações que quer definir como dependências da ação editada.
- ACTION_TYPE: o tipo de ação do fluxo de trabalho:
Opcional: clique em Formatar.
O seguinte exemplo de código mostra tableC
, que depende de viewA
, tableB
e de todas as afirmações de tableB
:
// filename is tableC.sqlx
config {
type: "table",
dependencies: ["viewA", {name: "tableB", includeDependentAssertions: true}]
}
SELECT * FROM ...
No exemplo de código anterior, o Dataform adiciona automaticamente todas as afirmações diretas de tableB
como dependências de tableC
durante a compilação.
Defina as afirmações de todas as ações de dependência como dependências
Para executar uma ação de fluxo de trabalho apenas quando todas as afirmações diretas de todas as ações de dependência forem aprovadas, defina o parâmetro dependOnDependencyAssertions
como true
na ação editada. O Dataform adiciona automaticamente as afirmações diretas das ações de dependência como dependências durante a compilação. O valor predefinido é false
.
Quando define o parâmetro dependOnDependencyAssertions
e os parâmetros includeDependentAssertions
num único ficheiro, o parâmetro includeDependentAssertions
tem prioridade para a ação de dependência para a qual está definido.
Para definir todas as afirmações de uma ação de dependência selecionada como dependências, siga estes passos:
- No espaço de trabalho de desenvolvimento, no painel Ficheiros, expanda
definitions/
. - Selecione um ficheiro SQLX de ação do fluxo de trabalho.
No ficheiro, defina o parâmetro
dependOnDependencyAssertions
comotrue
no seguinte formato:config { type: "ACTION_TYPE", dependOnDependencyAssertions: true, dependencies: [ "dependency1", "dependency2" ] }
Replace ACTION_TYPE: o tipo de ação do fluxo de trabalho. Os valores suportados incluem
table
,view
eoperations
.Opcional: clique em Formatar.
O exemplo de código seguinte mostra sometableE
, que depende de sometableA
,
sometabletableB
, sometableC
, sometableD
e todas as afirmações diretas das tabelas de dependências:
// filename is sometableE.sqlx
config {
type: "table",
dependOnDependencyAssertions: true,
dependencies: [ "sometableA", "sometableB" ]
}
SELECT * FROM ${ref("sometableC")}
SELECT * FROM ${ref("sometableD")}
No exemplo de código anterior, o Dataform adiciona automaticamente todas as
afirmações diretas de sometableA
, sometableB
, sometableC
e sometableD
como dependências de sometableE
durante a compilação.
Referencie uma tabela com um nome de tabela substituído
- Para fazer referência a uma tabela com um nome de tabela substituído, na função
ref
, introduza o nome de tabela substituído definido emname: ""
.
O seguinte exemplo de código faz referência a uma tabela com um nome substituído por
overridden_name
:
SELECT * FROM ${ref("overridden_name")}
Para mais informações sobre a substituição de nomes de tabelas, consulte Substitua as definições da tabela.
O que se segue?
- Para saber como definir afirmações como dependências, consulte o artigo Teste a qualidade dos dados.
- Para saber como declarar uma origem de dados, consulte o artigo Declare uma origem de dados.
- Para saber como definir operações SQL personalizadas, consulte o artigo Crie operações.
- Para saber como reutilizar código no seu fluxo de trabalho com inclusões, consulte o artigo Reutilize código num único repositório com inclusões.