Referencia del lenguaje de definición de calidad de datos (DQDL) - AWS Glue

Referencia del lenguaje de definición de calidad de datos (DQDL)

El lenguaje de definición de calidad de datos (DQDL) es un lenguaje específico de un dominio que se utiliza para definir las reglas de Calidad de datos de AWS Glue.

En esta guía, se presentan los conceptos clave de DQDL para entender el lenguaje. También proporciona una referencia para los tipos de reglas de DQDL con sintaxis y ejemplos. Antes de utilizar esta guía, le recomendamos que se familiarice con Calidad de datos de AWS Glue. Para obtener más información, consulte Calidad de datos de AWS Glue.

nota

Las reglas dinámicas solo se admiten en ETL de AWS Glue.

Sintaxis de DQDL

Un documento de DQDL distingue entre mayúsculas y minúsculas y contiene un conjunto de reglas que agrupa las reglas individuales de la calidad de los datos. Para crear un conjunto de reglas, debe crear una lista denominada Rules (en mayúscula), delimitada por un par de corchetes. La lista debe contener una o más reglas de DQDL separadas por comas, como en el ejemplo siguiente.

Rules = [ IsComplete "order-id", IsUnique "order-id" ]

Estructura de la regla

La estructura de una regla de DQDL depende del tipo de regla. Sin embargo, las reglas de DQDL se suelen ajustar al siguiente formato.

<RuleType> <Parameter> <Parameter> <Expression>

RuleType es el nombre que distingue entre mayúsculas y minúsculas del tipo de regla que quiere configurar. Por ejemplo, IsComplete, IsUnique o CustomSql. Los parámetros de la regla son diferentes para cada tipo de regla. Para obtener una referencia completa de los tipos de reglas de DQDL y sus parámetros, consulte Referencia de tipo de regla de DQDL.

Reglas compuestas

DQDL admite los siguientes operadores lógicos que puede utilizar para combinar las reglas. Estas reglas se denominan reglas compuestas.

y

El operador lógico and da como resultado true, siempre y cuando las reglas que conecta sean true. De lo contrario, la regla combinada da como resultado false. Cada regla que conecte con el operador and debe estar entre paréntesis.

El siguiente ejemplo usa el operador and para combinar dos reglas de DQDL.

(IsComplete "id") and (IsUnique "id")
o

El operador lógico or da como resultado true, siempre y cuando una o varias de las reglas que conecta sean true. Cada regla que conecte con el operador or debe estar entre paréntesis.

El siguiente ejemplo usa el operador or para combinar dos reglas de DQDL.

(RowCount "id" > 100) or (IsPrimaryKey "id")

Puede utilizar el mismo operador para conectar varias reglas, por lo que se permite la siguiente combinación de reglas.

(Mean "Star_Rating" > 3) and (Mean "Order_Total" > 500) and (IsComplete "Order_Id")

Sin embargo, no puede combinar los operadores lógicos en una sola expresión. Por ejemplo, no se permite la siguiente combinación.

(Mean "Star_Rating" > 3) and (Mean "Order_Total" > 500) or (IsComplete "Order_Id")

Funcionamiento de las reglas compuestas

De manera predeterminada, las reglas compuestas son evaluadas como reglas individuales a lo largo de todo el conjunto de datos y de la tabla y luego se combinan los resultados. En otras palabras, primero evalúan toda la columna y, a continuación, aplican el operador. Este comportamiento predeterminado se explica a continuación con un ejemplo:

# Dataset +------+------+ |myCol1|myCol2| +------+------+ | 2| 1| | 0| 3| +------+------+ # Overall outcome +----------------------------------------------------------+-------+ |Rule |Outcome| +----------------------------------------------------------+-------+ |(ColumnValues "myCol1" > 1) OR (ColumnValues "myCol2" > 2)|Failed | +----------------------------------------------------------+-------+

En el ejemplo anterior, AWS Glue Data Quality primero evalúa (ColumnValues "myCol1" > 1), lo cual resultará en una falla. Luego evaluará (ColumnValues "myCol2" > 2), que también fallará. La combinación de los dos resultados se indicará como fallida.

Sin embargo, si prefiere SQL como el comportamiento en caso de que necesite evaluar una fila entera, tiene que establecer de manera explícita el parámetro ruleEvaluation.scope como se muestra en additionalOptions, en el fragmento de código a continuación.

object GlueApp { val datasource = glueContext.getCatalogSource( database="<db>", tableName="<table>", transformationContext="datasource" ).getDynamicFrame() val ruleset = """ Rules = [ (ColumnValues "age" >= 26) OR (ColumnLength "name" >= 4) ] """ val dq_results = EvaluateDataQuality.processRows( frame=datasource, ruleset=ruleset, additionalOptions=JsonOptions(""" { "compositeRuleEvaluation.method":"ROW" } """ ) ) }

En Catálogo de datos de AWS Glue, puede configurar fácilmente esta opción en la interfaz de usuario, como se muestra a continuación.

En la captura de pantalla se muestra una ventana de configuración de reglas compuesta en la que puede elegir entre filas y columnas para la configuración de evaluación de reglas. Si elige Fila, las reglas compuestas se comportarán como una regla única que evalúa la fila en su totalidad. Si elige Columna, las reglas compuestas evaluarán las reglas individuales en todo el conjunto de datos y combinarán los resultados.

Una vez establecidas, las reglas compuestas se comportarán como una regla única que evalúa la fila en su totalidad. En el ejemplo a continuación se muestra este comportamiento.

# Row Level outcome +------+------+------------------------------------------------------------+---------------------------+ |myCol1|myCol2|DataQualityRulesPass |DataQualityEvaluationResult| +------+------+------------------------------------------------------------+---------------------------+ |2 |1 |[(ColumnValues "myCol1" > 1) OR (ColumnValues "myCol2" > 2)]|Passed | |0 |3 |[(ColumnValues "myCol1" > 1) OR (ColumnValues "myCol2" > 2)]|Passed | +------+------+------------------------------------------------------------+---------------------------+

Algunas reglas no son compatibles con esta característica debido a que los resultados generales se basan en umbrales o proporciones. Estas regulas se enumeran a continuación.

Reglas que se basan en las proporciones:

  • Integridad

  • DataSetMatch

  • ReferentialIntegrity

  • Singularidad

Reglas que se basan en los umbrales:

Cuando las reglas que se mencionan a continuación incluyen con un umbral, no son compatibles. Sin embargo, las reglas que no incluyen with threshold sí mantienen la compatibilidad.

  • ColumnDataType

  • ColumnValues

  • CustomSQL

Expressions

Si un tipo de regla no produce una respuesta booleana, debe proporcionar una expresión como parámetro para crear una respuesta booleana. Por ejemplo, la siguiente regla compara la media (promedio) de todos los valores de una columna con una expresión para obtener un resultado true (verdadero) o false (falso).

Mean "colA" between 80 and 100

Algunos tipos de reglas, como IsUnique y IsComplete ya producen una respuesta booleana.

En la tabla siguiente, se enumeran las expresiones que puede utilizar en las reglas de DQDL.

Expresiones de DQDL admitidas
Expression Descripción Ejemplo
=x Se resuelve en true si la respuesta del tipo de regla es igual que x.
Completeness "colA" = "1.0", ColumnValues "colA" = "2022-06-30"
!=x Se resuelve en verdadero si la respuesta del tipo de regla es igual a x.
ColumnValues "colA" != "a", ColumnValues "colA" != "2022-06-30"
> x Se resuelve en true si la respuesta del tipo de regla es mayor que x.
ColumnValues "colA" > 10
< x Se resuelve en true si la respuesta del tipo de regla es menor que x.
ColumnValues "colA" < 1000, ColumnValues "colA" < "2022-06-30"
>= x Se resuelve en true si la respuesta del tipo de regla es mayor o igual que x.
ColumnValues "colA" >= 10
<= x Se resuelve en true si la respuesta del tipo de regla es menor o igual que x.
ColumnValues "colA" <= 1000
entre x e y Se resuelve en true si la respuesta del tipo de regla se encuentra en un rango especificado (exclusivo). Solo debe utilizar este tipo de expresión para los tipos numéricos y de datos.
Mean "colA" between 8 and 100, ColumnValues "colA" between "2022-05-31" and "2022-06-30"
no está entre x e y Se resuelve en verdadero si la respuesta del tipo de regla no se encuentra en un rango especificado (inclusivo). Solo debe utilizar este tipo de expresión para los tipos numéricos y de fecha.
ColumnValues "colA" not between "2022-05-31" and "2022-06-30"
en [a, b, c, ...] Se resuelve en true si la respuesta del tipo de regla se encuentra en el conjunto especificado.
ColumnValues "colA" in [ 1, 2, 3 ], ColumnValues "colA" in [ "a", "b", "c" ]
no está en [a, b, c,... ] Se resuelve en true si la respuesta del tipo de regla no se encuentra en el conjunto especificado.
ColumnValues "colA" not in [ 1, 2, 3 ], ColumnValues "colA" not in [ "a", "b", "c" ]
coincide con /ab+c/i Se resuelve en true si la respuesta del tipo de regla coincide con una expresión regular.
ColumnValues "colA" matches "[a-zA-Z]*"
no coincide con /ab+c/i Se resuelve en true si la respuesta del tipo de regla no coincide con una expresión regular.
ColumnValues "colA" not matches "[a-zA-Z]*"
now() Solo funciona con el tipo de regla ColumnValues para crear una expresión de fecha.
ColumnValues "load_date" > (now() - 3 days)
en/coincide con [...] / no está en/no coincide con [...] with threshold Indica el porcentaje de valores que coinciden con las condiciones de la regla. Solo funciona con los tipos de regla ColumnValues, ColumnDataType y CustomSQL.
ColumnValues "colA" in ["A", "B"] with threshold > 0.8, ColumnValues "colA" matches "[a-zA-Z]*" with threshold between 0.2 and 0.9 ColumnDataType "colA" = "Timestamp" with threshold > 0.9

Palabras clave para NULL, EMPTY y WHITESPACES_ONLY

Para validar si una columna de cadenas contiene una cadena nula, vacía o solo con espacios en blanco, puede utilizar las palabras clave a continuación:

  • NULL/null: esta palabra clave se resuelve como verdadera para un valor null en una columna de cadenas.

    ColumnValues "colA" != NULL with threshold > 0.5 devolvería el valor verdadero si más del 50 % de los datos no tienen valores nulos.

    (ColumnValues "colA" = NULL) or (ColumnLength "colA" > 5) devolvería el valor verdadero para todas las filas que tengan un valor nulo o una longitud superior a 5. Tenga en cuenta que esto requiere que se utilice la opción “compositeRuleEvaluation.method” = “ROW”.

  • EMPTY/empty: esta palabra clave se resuelve como verdadera para un valor de cadena vacío (“”) en una columna de cadenas. Algunos formatos de datos transforman los valores nulos de una columna de cadenas en cadenas vacías. Esta palabra clave ayuda a remover las cadenas vacías en los datos.

    (ColumnValues "colA" = EMPTY) or (ColumnValues "colA" in ["a", "b"]) devolvería el valor verdadero si una fila está vacía, “a” o “b”. Tenga en cuenta que esto requiere que se utilice la opción “compositeRuleEvaluation.method” = “ROW”.

  • WHITESPACES_ONLY/whitespaces_only: esta palabra clave se resuelve como verdadera para una cadena que solo tiene un valor de espacios en blanco (“ ”) en una columna de cadenas.

    ColumnValues "colA" not in ["a", "b", WHITESPACES_ONLY] devolvería el valor verdadero si una fila no es ni “a” ni “b” ni solo contiene espacios en blanco.

    Reglas admitidas:

Puede utilizar las palabras clave a continuación para validar si una columna contiene un valor nulo al trabajar con expresiones numéricas o basadas en fechas.

  • NULL/null: esta palabra clave se resuelve como verdadera para un valor nulo en una columna de cadenas.

    ColumnValues "colA" in [NULL, "2023-01-01"] devolvería el valor verdadero si una fecha de la columna es 2023-01-01 o nula.

    (ColumnValues "colA" = NULL) or (ColumnValues "colA" between 1 and 9) devolvería el valor verdadero para todas las filas que tengan un valor nulo o cuyos valores sean entre 1 y 9. Tenga en cuenta que esto requiere que se utilice la opción “compositeRuleEvaluation.method” = “ROW”.

    Reglas admitidas:

Filtrado con la cláusula Where

nota

La cláusula Where solo es compatible con AWS Glue 4.0.

Puede filtrar sus datos durante la creación de reglas. Esto resulta útil cuando se quieren aplicar reglas condicionales.

<DQDL Rule> where "<valid SparkSQL where clause> "

El filtro debe especificarse con la palabra clave where, seguida de una instrucción de SparkSQL válida entre comillas ("").

Si desea agregar la cláusula Where a una regla que tiene un umbral, la cláusula Where debe especificarse antes de la condición de umbral.

<DQDL Rule> where "valid SparkSQL statement>" with threshold <threshold condition>

Con esta sintaxis, puede escribir reglas como las siguientes.

Completeness "colA" > 0.5 where "colB = 10" ColumnValues "colB" in ["A", "B"] where "colC is not null" with threshold > 0.9 ColumnLength "colC" > 10 where "colD != Concat(colE, colF)"

Comprobaremos si la instrucción de SparkSQL proporcionada es válida. Si no es válida, la evaluación de la regla fallará y mostrará el error IllegalArgumentException con el siguiente formato:

Rule <DQDL Rule> where "<invalid SparkSQL>" has provided an invalid where clause : <SparkSQL Error>

Comportamiento de la cláusula Where cuando la identificación del registro de errores a nivel de la fila está activada

Con Calidad de datos de AWS Glue, puede identificar registros específicos que fallaron. Al aplicar una cláusula Where a las reglas que admiten resultados a nivel de la fila, etiquetaremos las filas filtradas por la cláusula Where como Passed.

Si prefiere etiquetar por separado las filas filtradas como SKIPPED, puede configurar las siguientes additionalOptions para el trabajo de ETL.

object GlueApp { val datasource = glueContext.getCatalogSource( database="<db>", tableName="<table>", transformationContext="datasource" ).getDynamicFrame() val ruleset = """ Rules = [ IsComplete "att2" where "att1 = 'a'" ] """ val dq_results = EvaluateDataQuality.processRows( frame=datasource, ruleset=ruleset, additionalOptions=JsonOptions(""" { "rowLevelConfiguration.filteredRowLabel":"SKIPPED" } """ ) ) }

Como ejemplo, consulte la siguiente regla y el marco de datos:

IsComplete att2 where "att1 = 'a'"
id att1 att2 Resultados a nivel de la fila (predeterminado) Resultados a nivel de la fila (opción omitida) Comentarios
1 a f PASSED PASSED
2 b d PASSED SKIPPED La fila está filtrada, ya que att1 no es "a"
3 a null ERROR ERROR
4 a f PASSED PASSED
5 b null PASSED SKIPPED La fila está filtrada, ya que att1 no es "a"
6 a f PASSED PASSED

Reglas dinámicas

Ahora puede crear reglas dinámicas para comparar las métricas actuales generadas por sus reglas con sus valores históricos. Estas comparaciones históricas se habilitan usando el operador last() en las expresiones. Por ejemplo, la regla RowCount > last() se aplicará correctamente cuando el número de filas de la ejecución actual sea superior al recuento de filas anterior más reciente del mismo conjunto de datos. last() utiliza un argumento numérico natural opcional que describe cuántas métricas anteriores se deben tener en cuenta; last(k) donde k >= 1 hará referencia a las últimas métricas k.

  • Si no hay puntos de datos disponibles, last(k) devolverá el valor predeterminado, 0,0.

  • Si hay menos de las métricas k disponibles, last(k) devolverá todas las métricas anteriores.

Para formar expresiones válidas utilice last(k), donde k > 1 requiera una función de agregación para reducir varios resultados históricos a un solo número. Por ejemplo, RowCount > avg(last(5)) comprobará si el recuento de filas del conjunto de datos actual es estrictamente mayor que el promedio de los últimos cinco recuentos de filas del mismo conjunto de datos. RowCount > last(5) producirá un error, porque el recuento de filas del conjunto de datos actual no se puede comparar de forma significativa con una lista.

Funciones de agregación admitidas:

  • avg

  • median

  • max

  • min

  • sum

  • std (desviación estándar)

  • abs (valor absoluto)

  • index(last(k), i) permitirá seleccionar el valor en la posición i de los más recientes del último k. i está indexado a cero, por lo que index(last(3), 0) devolverá el punto de datos más reciente y index(last(3), 3) generará un error, ya que solo hay tres puntos de datos e intentaremos indexar el cuarto más reciente.

Ejemplos de expresiones

ColumnCorrelation

  • ColumnCorrelation "colA" "colB" < avg(last(10))

DistinctValuesCount

  • DistinctValuesCount "colA" between min(last(10))-1 and max(last(10))+1

La mayoría de los tipos de reglas con condiciones o umbrales numéricos admiten reglas dinámicas; consulte la tabla dada, Analizadores y reglas, para determinar si las reglas dinámicas son compatibles con su tipo de regla.

Analizadores

nota

El Catálogo de datos de AWS Glue no es compatible con los analizadores.

Las reglas de DQDL usan funciones denominadas analizadores para recopilar información sobre los datos. La expresión booleana de una regla hace uso de esta información para determinar si la regla debe funcionar correctamente o no. Por ejemplo, la regla RowCount RowCount > 5 usará un analizador de recuento de filas para descubrir el número de filas del conjunto de datos y compararlo con la expresión > 5, para comprobar si existen más de cinco filas en el conjunto de datos actual.

A veces, en lugar de crear reglas, recomendamos crear analizadores y luego hacer que generen estadísticas que puedan usarse para detectar anomalías. Para estos casos, puede crear analizadores. Los analizadores se diferencian de las reglas en estas formas.

Característica Analizadores Reglas
Parte del conjunto de reglas
Genera estadísticas
Genera observaciones
Puede evaluar y hacer valer una condición No
Puede configurar acciones como detener los trabajos por fallas o continuar procesando el trabajo No

Los analizadores pueden existir de forma independiente sin reglas, por lo que es posible configurarlos rápidamente y crear progresivamente reglas de calidad de datos.

Algunos tipos de reglas se pueden introducir en el bloque Analyzers del conjunto de reglas para ejecutar las reglas necesarias para los analizadores y recopilar información sin comprobar ninguna condición. Algunos analizadores no están asociados a las reglas y solo se pueden introducir en el bloque Analyzers. La siguiente tabla indica si cada elemento se admite como regla o como analizador independiente, junto con información adicional para cada tipo de regla.

Ejemplos de conjunto de reglas con el analizador

El siguiente conjunto de reglas usa:

  • una regla dinámica para comprobar si un conjunto de datos está creciendo por arriba de su media final en las últimas tres ejecuciones de tareas,

  • un analizador DistinctValuesCount para registrar la cantidad de valores distintos de la columna del conjunto de datos de Name,

  • un analizador ColumnLength para rastrear el tamaño mínimo y máximo de Name a lo largo del tiempo.

Los resultados de las métricas del analizador pueden verse en la pestaña Calidad de los datos durante la ejecución del trabajo.

Rules = [ RowCount > avg(last(3)) ] Analyzers = [ DistinctValuesCount "Name", ColumnLength "Name" ]

Calidad de datos de AWS Glue es compatible con los siguientes analizadores.

Nombre del analizador Funcionalidad
RowCount Calcula los recuentos de filas de un conjunto de datos
Completeness Calcula el porcentaje de integridad de una columna
Uniqueness Calcula el porcentaje de exclusividad de una columna
Mean Calcula la media de una columna numérica
Sum Calcula la suma de una columna numérica
StandardDeviation Calcula la desviación estándar de una columna numérica
Entropy Calcula la entropía de una columna numérica
DistinctValuesCount Calcula el número de valores distintos de una columna
UniqueValueRatio Calcula la relación de valores únicos de una columna
ColumnCount Calcula el número de columnas de un conjunto de datos
ColumnLength Calcula la longitud de una columna
ColumnValues Calcula el mínimo y el máximo para las columnas numéricas Calcula la longitud mínima de la columna y la longitud máxima de la columna para las columnas no numéricas
ColumnCorrelation Calcula las correlaciones de columnas para las columnas dadas
CustomSql Calcula las estadísticas que devuelve CustomSQL
AllStatistics Calcula las siguientes estadísticas:
  • RowCount, ColumnCount

  • Cada columna: integridad, exclusividad

  • Numérica: mínimo, máximo, entropía, media, desarrollo estándar, suma

  • Cadena: longitud mínima, longitud máxima

Comentarios

Puede utilizar el carácter “#” para agregar un comentario al documento DQDL. DQDL ignorará todo lo que figure a continuación del “#” hasta el final de la línea.

Rules = [ # More items should generally mean a higher price, so correlation should be positive ColumnCorrelation "price" "num_items" > 0 ]