Gravar resultados de qualidade de dados em tabelas do Data Catalog
Você pode configurar as execuções de avaliação do AWS Glue Data Quality para gravar automaticamente os resultados em tabelas Apache Iceberg no AWS Glue Data Catalog. Depois de habilitar a saída de resultados, você pode consultar os resultados de qualidade de dados diretamente usando , montar painéis com ferramentas de visualização e manter um histórico centralizado dos resultados de qualidade de dados de toda a sua conta.
Você pode gravar os seguintes tipos de resultados de qualidade de dados nas tabelas do Data Catalog:
-
Resultados de regras: o resultado de aprovação ou reprovação em cada regra do conjunto de regras, incluindo as métricas avaliadas e os motivos da reprovação
-
Resultados de perfilamento: estatísticas coletadas por analisadores, incluindo valores escalares (como média e desvio padrão) e dados de distribuição (histogramas e distribuições de valores)
-
Resultados no nível da linha: resultados de avaliação por registro que identificam quais linhas específicas do conjunto de dados foram aprovadas ou reprovadas em cada regra
-
Resultados de observação: previsões de detecção de anomalias, incluindo valores esperados, limites de predição e se o valor real foi sinalizado como uma anomalia
Pré-requisitos
Para gravar resultados de qualidade de dados nas tabelas do Data Catalog, o perfil do IAM usado na execução da avaliação deverá ter as seguintes permissões:
-
Permissão para criar e atualizar bancos de dados e tabelas no AWS Glue Data Catalog
-
Permissão para gravar no local do Amazon S3 onde os dados de tabela Iceberg são armazenados
A execução da avaliação usa o perfil do IAM especificado para gravar nas tabelas de resultados. Esse é o mesmo perfil que tem acesso à tabela de origem dos dados.
Configurar a saída de resultados
Você configura a saída dos resultados de qualidade de dados usando o parâmetro --additional-run-options da API StartDataQualityRulesetEvaluationRun ou o parâmetro additional_options nos trabalhos do AWS Glue ETL. Por padrão, o AWS Glue Data Quality não grava os resultados nas tabelas do Data Catalog. Habilite explicitamente cada tipo de resultado que desejar gravar.
Cada tipo de resultado tem seu próprio bloco de configuração com uma estrutura CatalogTableConfig compartilhada. Se você não fornecer uma CatalogTableConfig, o AWS Glue Data Quality derivará os valores padrão automaticamente, inclusive o nome da tabela e o caminho do Amazon S3.
A estrutura CatalogTableConfig contém os seguintes campos:
-
DatabaseName (opcional): o nome do banco de dados do catálogo na tabela de destino. Se não especificado, um banco de dados padrão será criado.
-
TableName (opcional): o nome da tabela de destino. Se não especificado, um nome de tabela padrão será usado.
-
S3Location (opcional): o local do Amazon S3 onde os dados de tabela são armazenados. Formato:
s3://. Se não especificado, os resultados serão armazenados em um local padrão.amzn-s3-demo-bucket/prefix/ -
CatalogId (opcional): o ID do AWS Glue Data Catalog no qual a tabela será criada. Se não especificado, AWS será usado como padrão.
Exemplo: configurar os resultados de regras e os resultados de perfilamento
aws glue start-data-quality-ruleset-evaluation-run \ --data-source '{ "GlueTable": { "DatabaseName": "my_database", "TableName": "my_table" } }' \ --role "arn:aws:iam::123456789012:role/GlueServiceRole" \ --ruleset-names '["my_ruleset"]' \ --additional-run-options '{ "DataQualityRuleResults": { "WriteDataQualityRuleResultsEnabled": true, "CatalogTableConfig": { "DatabaseName": "quality_results", "TableName": "rule_results" } }, "ProfilingResults": { "WriteProfilingResultsEnabled": true, "CatalogTableConfig": { "DatabaseName": "quality_results", "TableName": "profiles" } } }'
Exemplo: configurar os resultados no nível da linha
Para resultados no nível da linha, é possível também especificar o tipo dos registros a serem incluídos e o número máximo de linhas a serem gravadas.
aws glue start-data-quality-ruleset-evaluation-run \ --data-source '{ "GlueTable": { "DatabaseName": "my_database", "TableName": "my_table" } }' \ --role "arn:aws:iam::123456789012:role/GlueServiceRole" \ --ruleset-names '["my_ruleset"]' \ --additional-run-options '{ "RowLevelResults": { "MaxRowsToWrite": 5000, "ResultType": "FAILED_ONLY", "CatalogTableConfig": { "DatabaseName": "quality_results", "TableName": "row_level_results" } } }'
O parâmetro ResultType aceita os seguintes valores:
-
FAILED_ONLY: gravar somente as linhas reprovadas em pelo menos uma regra de qualidade de dados. -
PASSED_ONLY: gravar somente as linhas provadas em todas as regras de qualidade de dados. -
ALL: gravar todas as linhas com seus resultados de avaliação.
Exemplo: configurar em trabalhos de ETL do AWS Glue
Nos trabalhos de ETL do AWS Glue, você configura a saída de resultados usando o parâmetro additional_options com chaves em notação de pontos:
result = EvaluateDataQuality.process_rows( frame=dynamic_frame, ruleset=ruleset, publishing_options={ "dataQualityEvaluationContext": "my_context", "enableDataQualityResultsPublishing": True }, additional_options={ "observations.scope": "ALL", "dataQualityResultsPublishing.strategy": "BEST_EFFORT", "dataQualityResultsPublishing.resultsFormat.profilingResults.writeProfilingResultsEnabled": "true", "dataQualityResultsPublishing.resultsFormat.profilingResults.catalogTableConfig.databaseName": "my_db", "dataQualityResultsPublishing.resultsFormat.profilingResults.catalogTableConfig.tableName": "profiling_results", "dataQualityResultsPublishing.resultsFormat.profilingResults.catalogTableConfig.s3Location": "s3://amzn-s3-demo-bucket/profiling/", "dataQualityResultsPublishing.resultsFormat.profilingResults.catalogTableConfig.catalogId": "123456789012" } )
Exemplo: configurar resultados de observação
Você pode configurar os resultados de observação da mesma forma que outros tipos de resultados. Os resultados de observação exigem que a detecção de anomalias seja habilitada (ObservationScope: ALL):
aws glue start-data-quality-ruleset-evaluation-run \ --data-source '{ "GlueTable": { "DatabaseName": "my_database", "TableName": "my_table" } }' \ --role "arn:aws:iam::123456789012:role/GlueServiceRole" \ --ruleset-names '["my_ruleset"]' \ --additional-run-options '{ "ObservationScope": "ALL", "ObservationResults": { "WriteObservationResultsEnabled": true, "CatalogTableConfig": { "DatabaseName": "quality_results", "TableName": "observation_results" } } }'
Esquemas de tabela
O AWS Glue Data Quality grava cada tipo de resultado em uma tabela Iceberg separada. Os resultados de regras, os resultados de perfilamento (incluindo a tabela de resultados de distribuição separada) e as tabelas de resultados de observação são particionados por catalog_id, database_name, table_name e day(stored_on) para permitir consultas eficientes. Você pode filtrar por stored_on diretamente para consultas baseadas em hora e o Iceberg lida com a remoção de partições automaticamente.
Tabela de resultados de regras
A tabela de resultados da regras armazena o resultado de aprovação ou reprovação em cada regra avaliada durante uma execução de qualidade de dados.
| Coluna | Tipo | Descrição |
|---|---|---|
dq_result_id |
STRING | Identificador exclusivo do resultado de qualidade dos dados. |
rule_name |
STRING | O nome da regra (por exemplo, Rule_1). |
rule_description |
STRING | A expressão DQDL da regra. |
rule_result |
STRING | O resultado da avaliação: PASS ou FAIL. |
evaluation_message |
STRING | Uma mensagem descrevendo o motivo da reprovação, se aplicável. |
evaluated_metrics |
MAP<STRING, DOUBLE> | As métricas avaliadas pela regra. |
catalog_id |
STRING | O ID do catálogo da tabela de origem. |
database_name |
STRING | O nome do banco de dados da tabela de origem. |
table_name |
STRING | O nome da tabela de origem. |
ruleset_evaluation_run_id |
STRING | O ID da execução da avaliação. |
started_on |
TIMESTAMP | Quando a avaliação começou. |
completed_on |
TIMESTAMP | Quando a avaliação foi concluída. |
evaluated_rule |
STRING | A expressão da regra avaliada após a resolução do operando. |
ruleset_name |
STRING | Nome do conjunto de regras que produziu esse resultado. |
Tabela de resultados de perfilamento
A tabela a seguir descreve as colunas da tabela de resultados de perfilamento. Essa tabela armazena estatísticas escalares coletadas por analisadores e regras (como Mean, StandardDeviation e Completeness). O AWS Glue Data Quality armazena estatísticas de distribuição em uma tabela de resultados de distribuição separada.
| Coluna | Tipo | Descrição |
|---|---|---|
profile_id |
STRING | Identificador exclusivo do perfil de qualidade dos dados. |
statistic_id |
STRING | Identificador exclusivo da estatística. |
statistic_name |
STRING | Nome da estatística (por exemplo, Mean, Completeness) |
evaluation_level |
STRING | O nível no qual a estatística é avaliada: Dataset, Column ou Multicolumn. |
statistics_value |
DOUBLE | O valor escalar da estatística. |
statistic_properties |
MAP<STRING, STRING> | Propriedades adicionais da estatística. |
columns_referenced |
ARRAY<STRING> | As colunas referenciadas pela estatística. |
referenced_datasets |
ARRAY<STRING> | Conjuntos de dados referenciados para a estatística. |
column_name |
STRING | O nome da coluna de destino. |
dq_result_id |
STRING | Identificador do resultado de qualidade de dados. |
started_on |
TIMESTAMP | Quando a avaliação começou. |
completed_on |
TIMESTAMP | Quando a avaliação foi concluída. |
stored_on |
TIMESTAMP | Quando o registro foi gravado na tabela. |
catalog_id |
STRING | O ID do catálogo da tabela de origem. |
database_name |
STRING | O nome do banco de dados de origem. |
table_name |
STRING | Nome da tabela de origem. |
region |
STRING | AWSRegião . |
account_id |
STRING | ID da conta da AWS. |
ruleset_evaluation_run_id |
STRING | O ID da execução da avaliação. |
Tabela de resultados de distribuição
A tabela a seguir descreve as colunas da tabela de resultados de distribuição. Os resultados de distribuição são armazenados separadamente das estatísticas de perfilamento escalar, com uma linha para cada compartimento ou categoria. Você pode configurar essa tabela dentro do bloco ProfilingResults.DistributionResults.
| Coluna | Tipo | Descrição |
|---|---|---|
statistic_id |
STRING | Identificador exclusivo da estatística de distribuição. |
column_name |
STRING | A coluna de origem (por exemplo, “idade” ou “departamento”). |
data_type |
STRING | O tipo de dados da coluna (por exemplo, “LongType”, “StringType”). |
num_bins |
INT | Número de compartimentos usados na distribuição. |
bin_index |
INT | Posição do compartimento baseada em 0. |
bin_label |
STRING | Para colunas categóricas: o valor distinto. NULL para colunas numéricas. |
bin_lower_bound |
STRING | Para colunas numéricas: a borda inferior do compartimento. NULL para colunas categóricas. |
bin_upper_bound |
STRING | Para colunas numéricas: a borda superior do compartimento. NULL para colunas categóricas. |
bin_count |
BIGINT | Contagem de frequência desse compartimento. |
null_count |
INT | Número de valores NULL excluídos da distribuição. Mesmo valor em todas as linhas para uma determinada estatística em uma execução. NULL quando nenhum valor nulo está presente. |
tail_count |
INT | Frequência agregada de valores categóricos além dos 20 primeiros. Mesmo valor em todas as linhas para uma determinada estatística em uma execução. NULL para histogramas numéricos. |
profile_id |
STRING | Identificador do perfil. |
dq_result_id |
STRING | Identificador do resultado de qualidade de dados. |
ruleset_evaluation_run_id |
STRING | Identificador da execução da avaliação. |
started_on |
TIMESTAMP | Quando a avaliação começou. |
completed_on |
TIMESTAMP | Quando a avaliação foi concluída. |
stored_on |
TIMESTAMP | Quando o registro foi gravado na tabela. |
catalog_id |
STRING | O ID do catálogo da tabela de origem. |
database_name |
STRING | O nome do banco de dados de origem. |
table_name |
STRING | Nome da tabela de origem. |
region |
STRING | AWSRegião . |
account_id |
STRING | ID da conta da AWS. |
Tabela de resultados no nível da linha
A tabela a seguir descreve as colunas da tabela de resultados no nível da linha. Você pode usar essa tabela para identificar os registros específicos que foram reprovados pelas regras de qualidade de dados.
| Coluna | Tipo | Descrição |
|---|---|---|
| Colunas de origem | Varia | Todas as colunas dos dados da fonte original. |
data_quality_rules_pass |
ARRAY<STRING> | Regras que foram aprovadas para esse registro. |
data_quality_rules_fail |
ARRAY<STRING> | Regras que foram reprovadas para esse registro. |
data_quality_rules_skip |
ARRAY<STRING> | Regras que foram ignoradas para esse registro. |
data_quality_evaluation_result |
STRING | O resultado geral da avaliação desse registro: Passed ou Failed. |
dq_result_id |
STRING | Identificador exclusivo do resultado de qualidade dos dados. |
ruleset_evaluation_run_id |
STRING | O ID da execução da avaliação. |
started_on |
TIMESTAMP | Quando a avaliação começou. |
completed_on |
TIMESTAMP | Quando a avaliação foi concluída. |
stored_on |
TIMESTAMP | Quando o registro foi gravado na tabela. |
catalog_id |
STRING | O ID do catálogo da tabela de origem. |
database_name |
STRING | O nome do banco de dados de origem. |
table_name |
STRING | Nome da tabela de origem. |
region |
STRING | AWSRegião . |
account_id |
STRING | ID da conta da AWS. |
Tabela de resultados de observação
A tabela de resultados de observação armazena as previsões de detecção de anomalias para cada estatística em toda execução da avaliação. A tabela inclui todos os resultados des previsões: anomalias, valores normais e previsões ignoradas. Isso permite renderizar gráficos de tendências contínuas com faixas de previsão.
| Coluna | Tipo | Descrição |
|---|---|---|
statistic_id |
STRING | Identificador da estatística que está sendo monitorada. |
statistic_name |
STRING | Nome da estatística monitorada. |
prediction_outcome |
STRING | O resultado da detecção de anomalias: ANOMALY, NOT_ANOMALY ou SKIPPED. |
expected_value |
DOUBLE | O valor esperado previsto. NULL quando a previsão é ignorada. |
lower_bound |
DOUBLE | O limite inferior do intervalo previsto. NULL quando a previsão é ignorada. |
upper_bound |
DOUBLE | O limite superior do intervalo previsto. NULL quando a previsão é ignorada. |
observation_message |
STRING | Uma descrição da anomalia, se detectada. |
training_input |
STRING | Se esse ponto de dados é incluído no modelo de detecção de anomalias: INCLUDED ou EXCLUDED. |
ruleset_evaluation_run_id |
STRING | O ID da execução da avaliação. |
recorded_on |
TIMESTAMP | Quando a observação foi registrada. |
stored_on |
TIMESTAMP | Quando o registro foi gravado na tabela. |
actual_value |
DOUBLE | O valor real observado da estatística. |
training_status |
STRING | Status do treinamento de modelo de detecção de anomalias (por exemplo, PENDING, COMPLETED). |
recommended_rules |
STRING | Regras recomendadas com base na previsão de detecção de anomalias. |
modified_rules |
STRING | Regras modificadas com limites atualizados com base nas previsões. |
catalog_id |
STRING | O ID do catálogo da tabela de origem. |
database_name |
STRING | O nome do banco de dados de origem. |
table_name |
STRING | Nome da tabela de origem. |
nota
A tabela de resultados de observação usa um modelo de gravação somente acréscimo. Quando você exclui um ponto de dados usando a API BatchPutDataQualityStatisticAnnotation, uma nova linha é acrescentada com training_input definido como EXCLUDED. Para consultar o estado mais recente de cada observação, use o timestamp stored_on para identificar a linha mais recente de cada combinação de estatística e execução.
nota
Essa tabela também armazena observações de transbordamento de distribuição, geradas quando mais de 2% dos valores ficam fora dos limites de compartimento congelados. Essas linhas têm statistic_name = 'Distribution' e prediction_outcome é NULL. O campo observation_message contém a descrição do transbordamento.
Consultar resultados com
Depois que a avaliação de qualidade de dados é concluída, é possível consultar as tabelas de resultados diretamente usando . Os exemplos a seguir demonstram padrões comuns de consulta.
Exemplo: encontrar regras reprovadas em uma execução específica
SELECT rule_name, rule_description, evaluation_message, evaluated_metrics FROM quality_results.rule_results WHERE ruleset_evaluation_run_id = 'dqr-12345678' AND rule_result = 'FAIL' ORDER BY rule_name;
Exemplo: visualizar estatísticas de perfilamento ao longo do tempo
SELECT stored_on, statistics_value FROM quality_results.profiles WHERE database_name = 'my_database' AND table_name = 'my_table' AND statistic_name = 'Mean' AND columns_referenced = ARRAY['salary'] ORDER BY stored_on;
Exemplo: identificar linhas que foram reprovadas em uma regra específica
SELECT * FROM quality_results.row_level_results WHERE data_quality_evaluation_result = 'Failed' AND contains(data_quality_rules_fail, 'IsComplete "email"');
Exemplo: visualizar um histograma numérico
SELECT bin_index, bin_lower_bound, bin_upper_bound, bin_count FROM quality_results.distributions WHERE column_name = 'salary' AND ruleset_evaluation_run_id = 'dqrun-abc123' ORDER BY bin_index;
Exemplo: visualizar uma distribuição categórica de valores
SELECT bin_label, bin_count FROM quality_results.distributions WHERE column_name = 'department' AND ruleset_evaluation_run_id = 'dqrun-abc123' ORDER BY bin_count DESC;
Exemplo: acompanhar a frequência da categoria ao longo do tempo
SELECT started_on, bin_count FROM quality_results.distributions WHERE column_name = 'status' AND bin_label = 'active' ORDER BY started_on;
Exemplo: visualizar tendências de detecção de anomalias com faixas de previsão
SELECT o.recorded_on, p.statistics_value AS actual_value, o.expected_value, o.lower_bound, o.upper_bound, o.prediction_outcome FROM quality_results.profiles p JOIN quality_results.observation_results o ON p.statistic_id = o.statistic_id AND p.ruleset_evaluation_run_id = o.ruleset_evaluation_run_id WHERE p.database_name = 'my_database' AND p.table_name = 'my_table' AND p.statistic_name = 'RowCount' AND p.stored_on >= DATE '2025-03-01' ORDER BY p.stored_on;
Exemplo: consultar o estado da observação mais recente após as anotações
Como a tabela de resultados de observação usa um modelo somente acréscimo, as anotações de exclusão adicionam novas linhas. Use uma consulta de desduplicação para obter o estado mais recente de cada observação:
SELECT statistic_id, statistic_name, prediction_outcome, expected_value, lower_bound, upper_bound, training_input, stored_on FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY statistic_id, ruleset_evaluation_run_id ORDER BY stored_on DESC ) AS rn FROM quality_results.observation_results WHERE database_name = 'my_database' AND table_name = 'my_table' ) WHERE rn = 1 ORDER BY stored_on;
Considerações
Leve em conta as seguintes considerações ao gravar resultados de qualidade de dados em tabelas do Data Catalog:
-
O AWS Glue Data Quality armazena os resultados no formato Apache Iceberg, que é compatível com consultas eficientes de viagem no tempo e remoção de partições.
-
Uma única tabela de resultados pode armazenar os resultados de várias tabelas de origem. Use as colunas de partição
catalog_id,database_nameetable_namepara filtrar os resultados de uma fonte específica. -
O AWS Glue Data Quality grava os resultados de observação de forma assíncrona após a conclusão da execução da avaliação. Pode haver um breve atraso até que as observações apareçam na tabela.
-
Nas estatísticas de distribuição na tabela de resultados de distribuição, cada compartimento ou categoria é armazenado como uma linha separada. Por exemplo, um histograma com 20 compartimentos gera 20 linhas na tabela para essa estatística.