Informazioni sulle asserzioni
Un'affermazione è una query di test della qualità dei dati che trova le righe che violano una o più condizioni specificate nella query. Se la query restituisce righe, l'affermazione non va a buon fine. Dataform esegue le verifiche ogni volta che aggiorna il tuo workflow SQL e ti avvisa se una verifica non va a buon fine.
Dataform crea automaticamente in BigQuery visualizzazioni contenenti i risultati delle query di asserzione compilate. Come configurato nel file delle impostazioni del flusso di lavoro, Dataform crea queste visualizzazioni in uno schema di asserzioni in cui puoi esaminare i risultati delle asserzioni.
Ad esempio, per lo schema dataform_assertions
predefinito, Dataform
crea una vista in BigQuery nel seguente formato:
dataform_assertions.assertion_name
.
Puoi creare asserzioni per tutti i tipi di tabelle Dataform: tabelle, tabelle incrementali, viste e viste materializzate.
Puoi creare asserzioni nei seguenti modi:
Aggiungi le asserzioni integrate al blocco di configurazione di una tabella.
Puoi aggiungere asserzioni predefinite al blocco
config
di una tabella e specificare le relative condizioni.Aggiungi le asserzioni manuali in un file SQLX separato.
Scrivi manualmente le asserzioni personalizzate in un file SQLX separato per casi d'uso avanzati o per set di dati non creati da Dataform.
Prima di iniziare
Nella console Google Cloud, vai alla pagina Dataform.
Seleziona o crea un repository.
Seleziona o crea un'area di lavoro di sviluppo.
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per creare asserzioni,
chiedi all'amministratore di concederti il ruolo IAM
Editor di Dataform (roles/dataform.editor
) nelle aree di lavoro.
Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.
Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.
Creare asserzioni predefinite
Puoi aggiungere asserzioni Dataform integrate al blocco config
di una tabella. Dataform esegue queste verifiche dopo la creazione della tabella. Dopo che Dataform ha creato la tabella, puoi vedere se l'affermazione è passata nella scheda Log di esecuzione del flusso di lavoro della tua area di lavoro.
Nel blocco config
di una tabella puoi creare le seguenti asserzioni:
nonNull
Questa condizione afferma che le colonne specificate non sono nulle in tutte le righe della tabella. Questa condizione viene utilizzata per le colonne che non possono mai essere null.
Il seguente esempio di codice mostra un'affermazione
nonNull
nel bloccoconfig
di una tabella:
config {
type: "table",
assertions: {
nonNull: ["user_id", "customer_id", "email"]
}
}
SELECT ...
rowConditions
Questa condizione afferma che tutte le righe della tabella seguono la logica personalizzata che hai definito. Ogni condizione riga è un'espressione SQL personalizzata e ogni riga della tabella viene valutata in base a ogni condizione riga. L'affermazione non va a buon fine se una riga della tabella genera
false
.Il seguente esempio di codice mostra un'affermazione
rowConditions
personalizzata nelconfig
blocco di una tabella incrementale:
config {
type: "incremental",
assertions: {
rowConditions: [
'signup_date is null or signup_date > "2022-08-01"',
'email like "%@%.%"'
]
}
}
SELECT ...
uniqueKey
Questa condizione afferma che, in una colonna specificata, nessuna riga della tabella ha lo stesso valore.
Il seguente esempio di codice mostra un'affermazione
uniqueKey
nel bloccoconfig
di una vista:
config {
type: "view",
assertions: {
uniqueKey: ["user_id"]
}
}
SELECT ...
uniqueKeys
Questa condizione afferma che, nelle colonne specificate, nessuna riga della tabella ha lo stesso valore. L'affermazione non va a buon fine se nella tabella è presente più di una riga con gli stessi valori per tutte le colonne specificate.
Il seguente esempio di codice mostra un'affermazione
uniqueKeys
nel bloccoconfig
di una tabella:
config {
type: "table",
assertions: {
uniqueKeys: [["user_id"], ["signup_date", "customer_id"]]
}
}
SELECT ...
Aggiungere asserzioni al blocco config
Per aggiungere asserzioni al blocco di configurazione di una tabella:
- Nella tua area di lavoro di sviluppo, seleziona un file SQLX di definizione della tabella nel riquadro File.
- Nel blocco
config
del file della tabella, inserisciassertions: {}
. - All'interno di
assertions: {}
, aggiungi le tue asserzioni. - (Facoltativo) Fai clic su Formato.
Il seguente esempio di codice mostra le condizioni aggiunte nel blocco config
:
config {
type: "table",
assertions: {
uniqueKey: ["user_id"],
nonNull: ["user_id", "customer_id"],
rowConditions: [
'signup_date is null or signup_date > "2019-01-01"',
'email like "%@%.%"'
]
}
}
SELECT ...
Creare asserzioni manuali con SQLX
Le asserzioni manuali sono query SQL scritte in un file SQLX dedicato. Una query SQL di asserzione manuale deve restituire zero righe. Se la query restituisce righe quando viene eseguita, l'asserzione non va a buon fine.
Per aggiungere asserzioni manuali in un nuovo file SQLX:
- Nel riquadro File, accanto a
definitions/
, fai clic sul menuAltro.
- Fai clic su Crea file.
Nel campo Aggiungi un percorso del file, inserisci il nome del file seguito da
.sqlx
. Ad esempio:definitions/custom_assertion.sqlx
.I nomi dei file possono includere solo numeri, lettere, trattini e trattini bassi.
Fai clic su Crea file.
Nel riquadro File, fai clic sul nuovo file.
Nel file, inserisci:
config { type: "assertion" }
Sotto il blocco
config
, scrivi una o più query SQL.(Facoltativo) Fai clic su Formato.
Il seguente esempio di codice mostra un'affermazione manuale in un file SQLX che afferma
che i campi A, B e c
non sono mai NULL
in sometable
:
config { type: "assertion" }
SELECT
*
FROM
${ref("sometable")}
WHERE
a IS NULL
OR b IS NULL
OR c IS NULL
Impostare le asserzioni come dipendenze
Quando l'azione di flusso di lavoro B dipende dall'azione di flusso di lavoro A che contiene asserzioni, il fallimento delle asserzioni dell'azione A non impedisce a Dataform di eseguire l'azione B. Per eseguire l'azione B solo se le asserzioni dell'azione A passano, devi impostare le asserzioni dell'azione A come dipendenze dell'azione B.
Puoi impostare le asserzioni come dipendenze di un'azione selezionata nei seguenti modi:
- Impostare le asserzioni selezionate come dipendenze
Puoi impostare manualmente le asserzioni selezionate come dipendenze aggiungendole a
dependencies: [ "" ]
nel bloccoconfig
dell'azione modificata.Ad esempio, se l'azione B dipende dall'azione A e vuoi che l'azione B dipenda solo da alcune affermazioni selezionate dell'azione A, puoi aggiungere queste affermazioni selezionate al blocco
config
dell'azione B.Puoi impostare manualmente le asserzioni selezionate come dipendenze per tutti i tipi di azioni, ad eccezione delle dichiarazioni delle origini dati.
- Impostare le asserzioni di un'azione di dipendenza selezionata come dipendenze
Puoi impostare il parametro
includeDependentAssertions
in modo da impostare automaticamente tutte le asserzioni dirette di un'azione del flusso di lavoro delle dipendenze selezionata come dipendenze dell'azione modificata. Dataform aggiunge queste asserzioni come dipendenze durante ogni compilazione dell'azione per garantire che le dipendenze siano aggiornate se le asserzioni dell'azione di dipendenza cambiano.Ad esempio, se l'azione C dipende dalle azioni A e B, ma vuoi che l'azione C dipenda solo dalle asserzioni dell'azione A, puoi modificare l'azione C e impostare il parametro
includeDependentAssertions
per impostare automaticamente tutte le asserzioni dell'azione A come dipendenze dell'azione C.Puoi impostare il parametro
includeDependentAssertions
per azioni di tipo:table
view
operations
- Impostare le asserzioni di tutte le azioni di dipendenza come dipendenze
Puoi impostare il parametro
dependOnDependencyAssertions
per impostare automaticamente tutte le asserzioni dirette di tutte le azioni di dipendenza dell'azione modificata come dipendenze aggiuntive dell'azione modificata. Dataform aggiunge queste asserzioni come dipendenze durante ogni compilazione dell'azione per garantire che le dipendenze siano aggiornate se le asserzioni dell'azione di dipendenza cambiano.Ad esempio, se l'azione C dipende dalle azioni A e B, puoi modificare l'azione C e impostare il parametro
dependOnDependencyAssertions
in modo da impostare automaticamente tutte le asserzioni delle azioni A e B come dipendenze dell'azione C.Puoi impostare il parametro
dependOnDependencyAssertions
per azioni di tipo:table
view
operations
Quando imposti i parametri dependOnDependencyAssertions
e includeDependentAssertions
in un unico file, il parametro includeDependentAssertions
ha la precedenza.
Ad esempio, se imposti dependOnDependencyAssertions
su true
, ma imposti anche includeDependentAssertions
su false
per un'azione di dipendenza selezionata, Dataform non aggiungerà le asserzioni di quell'azione alle dipendenze.
Il seguente esempio di codice mostra i parametri dependOnDependencyAssertions
e
includeDependentAssertions
impostati nello stesso file di definizione della tabella:
// filename is tableName.sqlx
config {
type: "table",
dependOnDependencyAssertions: true,
dependencies: [ "actionA", {name: "actionB", includeDependentAssertions: false} ]
}
SELECT * FROM ${ref("actionC")}
Nell'esempio di codice precedente, Dataform aggiunge tutte le asserzioni dirette di actionA
e actionC
alle dipendenze di tableName
durante la compilazione.
Impostare le asserzioni selezionate come dipendenze
Per eseguire un'azione di flusso di lavoro solo quando le asserzioni selezionate passano,
puoi aggiungere l'affermazione selezionata a dependencies: [ "" ]
nel blocco config
dell'azione modificata.
Per impostare un'affermazione selezionata come dipendenza di un'azione di flusso di lavoro selezionata:
- Nell'area di lavoro di sviluppo, espandi
definitions/
nel riquadro File. - Seleziona un file SQLX dell'azione di flusso di lavoro.
- Nel blocco
config
del file di azioni, inseriscidependencies: [ "" ]
. All'interno di
dependencies: [ "" ]
, inserisci il nome dell'affermazione dell'azione o il nome del file dell'affermazione manuale che vuoi impostare come dipendenza in uno dei seguenti formati:nonNull
config { type: "ACTION_TYPE", dependencies: [ "ACTION_DATASET_NAME_ACTION_NAME_assertions_nonNull"] }
Sostituisci quanto segue:
- ACTION_TYPE: il tipo di azione del flusso di lavoro:
table
,view
ooperations
. - ACTION_DATASET_NAME: il nome del set di dati in cui è definita l'azione. Il set di dati predefinito è definito nel file delle impostazioni del flusso di lavoro.
- ACTION_NAME: il nome dell'azione in cui è definita l'affermazione.
rowConditions
config { type: "ACTION_TYPE", dependencies: [ "ACTION_DATASET_NAME_ACTION_NAME_assertions_rowConditions"] }
Sostituisci quanto segue:
- ACTION_TYPE: il tipo di azione del flusso di lavoro:
table
,view
ooperations
. - DATASET_NAME: il nome del set di dati in cui è definita l'azione. Il set di dati predefinito è definito nel file delle impostazioni del flusso di lavoro.
- ACTION_NAME: il nome dell'azione in cui è definita l'affermazione.
uniqueKey
config { type: "ACTION_TYPE", dependencies: [ "ACTION_DATASET_NAME_ACTION_NAME_assertions_uniqueKey_INDEX"] }
Sostituisci quanto segue:
- ACTION_TYPE: il tipo di azione del flusso di lavoro:
table
,view
ooperations
. - DATASET_NAME: il nome del set di dati in cui è definita la tabella. Il set di dati predefinito è definito nel file delle impostazioni del flusso di lavoro.
- ACTION_NAME: il nome della tabella in cui è definita l'affermazione.
- INDEX: l'indice dell'array di chiavi definito nell'affermazione
uniqueKey
che vuoi aggiungere come dipendenza. Ad esempio,0
o1
. Se nell'affermazione è definito un solo array di chiavi, l'indice è0
.
uniqueKeys
config { type: "ACTION_TYPE", dependencies: [ "ACTION_DATASET_NAME_ACTION_NAME_assertions_uniqueKeys_INDEX"] }
Sostituisci quanto segue:
- ACTION_TYPE: il tipo di azione del flusso di lavoro:
table
,view
ooperations
. - DATASET_NAME: il nome del set di dati in cui è definita la tabella. Il set di dati predefinito è definito nel file delle impostazioni del flusso di lavoro.
- ACTION_NAME: il nome della tabella in cui è definita l'affermazione.
- INDEX: l'indice dell'array di chiavi definito nell'affermazione
uniqueKeys
che vuoi aggiungere come dipendenza, ad esempio0
o1
. Se nell'affermazione è definito un solo array di chiavi, l'indice è0
.
asserzione manuale
config { type: "ACTION_TYPE", dependencies: [ "MANUAL_ASSERTION_NAME"] }
Sostituisci quanto segue:
- ACTION_TYPE: il tipo di azione del flusso di lavoro:
table
,view
ooperations
. - MANUAL_ASSERTION_NAME il nome dell'affermazione manuale.
- ACTION_TYPE: il tipo di azione del flusso di lavoro:
Per aggiungere un'altra asserzione come dipendenza alla tabella modificata, ripeti il passaggio 4.
(Facoltativo) Fai clic su Formato.
Il seguente esempio di codice mostra le asserzioni aggiunte alla tabella A,
definita nel set di dati dataform
:
config {
type: "table",
assertions: {
uniqueKey: ["user_id"],
nonNull: ["user_id", "customer_id"],
}
}
Il seguente esempio di codice mostra le asserzioni della tabella A aggiunte come dipendenze alla tabella B:
config {
type: "table",
dependencies: [ "dataform_A_assertions_uniqueKey_0", "dataform_A_assertions_nonNull"]
}
Il seguente esempio di codice mostra un'affermazione manuale definita nel
manualAssertion.sqlx
file, aggiunta come dipendenza a una vista:
config {
type: "view",
dependencies: [ "manualAssertion"]
}
Il seguente esempio di codice mostra il file manual_assertion
e le assert della tabella sometable
aggiunte come dipendenze a una tabella:
config {
type: "table",
dependencies: [ "manual_assertion", "dataform_sometable_assertions_nonNull" , "dataform_sometable_assertions_rowConditions"]
}
SELECT * FROM ${ref("referenced_table")} LEFT JOIN ...
Impostare le asserzioni di un'azione selezionata come dipendenze
Per eseguire un'azione di flusso di lavoro solo quando tutte le asserzioni dirette di un'azione di dipendenza selezionata passano, imposta il parametro includeDependentAssertions
su true
nell'azione modificata.
Dataform aggiunge automaticamente alle dipendenze le asserzioni dirette dell'azione di dipendenza selezionata durante la compilazione. Il valore predefinito è false
.
Per impostare tutte le asserzioni di un'azione di dipendenza selezionata come dipendenze:
- Nell'area di lavoro di sviluppo, espandi
definitions/
nel riquadro File. - Seleziona un file SQLX dell'azione di flusso di lavoro.
Nel file, imposta il parametro
includeDependentAssertions
sutrue
in uno dei seguenti modi:Nel blocco
config
config { type: "ACTION_TYPE", dependencies: [{name: "dEPENDENCY_ACTION_NAME", includeDependentAssertions: true}] }
Sostituisci quanto segue:
- ACTION_TYPE: il tipo di azione del flusso di lavoro:
table
,view
ooperations
. - DEPENDENCY_ACTION_NAME: il nome dell'azione di dipendenza le asserzioni da impostare come dipendenze dell'azione modificata.
Nell'istruzione
SELECT
config { type: "ACTION_TYPE" } SELECT * FROM ${ref({name: "DEPENDENCY_ACTION_NAME", includeDependentAssertions: true})}
Sostituisci quanto segue:
- ACTION_TYPE: il tipo di azione del flusso di lavoro:
table
,view
ooperations
. - DEPENDENCY_ACTION_NAME: il nome dell'azione di dipendenza le asserzioni da impostare come dipendenze dell'azione modificata.
- ACTION_TYPE: il tipo di azione del flusso di lavoro:
(Facoltativo) Fai clic su Formato.
Il seguente esempio di codice mostra tableC
che dipende da viewA
, tableB
e da tutte le asserzioni di tableB
:
// filename is tableC.sqlx
config {
type: "table",
dependencies: ["viewA", {name: "tableB", includeDependentAssertions: true}]
}
SELECT * FROM ...
Nell'esempio di codice precedente, Dataform aggiunge automaticamente tutte le affermazioni dirette di tableB
come dipendenze di tableC
durante la compilazione.
Impostare le asserzioni di tutte le azioni di dipendenza come dipendenze
Per eseguire un'azione di flusso di lavoro solo quando tutte le asserzioni dirette di tutte le azioni di dipendenza passano, imposta il parametro dependOnDependencyAssertions
su true
nell'azione modificata.
Dataform aggiunge automaticamente asserzioni dirette delle azioni di dipendenza come dipendenze durante la compilazione. Il valore predefinito è false
.
Quando imposti i parametri dependOnDependencyAssertions
e includeDependentAssertions
in un unico file, il parametro includeDependentAssertions
ha la precedenza per l'azione di dipendenza per cui è impostato.
Per impostare tutte le asserzioni di un'azione di dipendenza selezionata come dipendenze:
- Nell'area di lavoro di sviluppo, espandi
definitions/
nel riquadro File. - Seleziona un file SQLX dell'azione di flusso di lavoro.
Nel file, imposta il parametro
dependOnDependencyAssertions
sutrue
nel seguente formato:config { type: "ACTION_TYPE", dependOnDependencyAssertions: true, dependencies: [ "dependency1", "dependency2" ] }
Sostituisci ACTION_TYPE: il tipo di azione del flusso di lavoro. I valori supportati includono
table
,view
eoperations
.(Facoltativo) Fai clic su Formato.
Il seguente esempio di codice mostra sometableE
che dipende da sometableA
,
sometabletableB
, sometableC
e sometableD
e da tutte le asserzioni dirette delle
tabelle delle dipendenze:
// filename is sometableE.sqlx
config {
type: "table",
dependOnDependencyAssertions: true,
dependencies: [ "sometableA", "sometableB" ]
}
SELECT * FROM ${ref("sometableC")}
SELECT * FROM ${ref("sometableD")}
Nell'esempio di codice precedente, Dataform aggiunge automaticamente tutte le affermazioni dirette di sometableA
, sometableB
, sometableC
e sometableD
come dipendenze di sometableE
durante la compilazione.
Passaggi successivi
- Per scoprire di più sui tipi di asserzioni, consulta la documentazione dell'API Dataform.
- Per scoprire come definire le asserzioni con JavaScript, consulta Creare flussi di lavoro Dataform con JavaScript.
- Per scoprire come eseguire manualmente i flussi di lavoro, consulta Attivare l'esecuzione.