-
Notifications
You must be signed in to change notification settings - Fork 7
Release Notes
Este nuevo release contiene lo siguiente:
Resumen nuevas funcionalidades:
- issue #16: Permite indicar opción de hacer backup sobre tablas maestras y de referencia. Para ello en globalSettings se debe agrega el atributo MDM_SaveBackup para habilitarlo a nivel de aplicativo, MDM_Backup_Path para indicar el path y el método setSaveBackup en huemul_Tables para indicar qué tablas específicas se deben respaldar.
- issue #34: En huemul_BigDataGovernance se agrega método huemul_showDemoLines para habilitar o deshabilitar el despliegue de 2 líneas de ejemplo al abrir un archivo RAW
- issue #35: A partir de esta versión se incluye compatibilidad con Oracle y SQL Server para el modelo de control de procesos. Lo anterior se suma a compatibilidad con PostgreSQL y MySQL. Esta compatibilidad incluye aplicar cambios en los nombres de algunos campos en el modelo de control actual, todo esto se hace de forma automática ejecutando el script de actualización del modelo de control, por tanto todos los datos del modelo de control anterior se mantienen intactos.
- issue #36: A partir de esta versión se almacena el resultante de DataQuality al fallar las reglas de Primary Key y Foreing Key.
- issue #37: A partir de esta versión se incluye compatibilidad con log4j, de esta forma huemul registra toda su actividad utilizando esta librería.
- issue #38: A partir de esta versión es posible incluir full trazabilidad de cambios en los valores de los campos para aquellas tablas que sean de tipo master y reference
- issue #43: En huemul_DataQuality se agrega el método setDQ_ExternalCode que permite incluir un ID externo para enlazar las reglas de calidad con una herramienta de gestión externa.
- issue #44: A partir de esta versión, se incorpora el linaje de datos a nivel de campos, esto es posible utilizando los métodos de transformación de DataFrame expuestos por Huemul a través de huemul_Tables, huemul_DataLake y huemul_DataFrame.
- issue #45: En huemul_BigDataGovernance se agrega método hdfsPath_exists que retorna true si la ruta indicada existe en el directorio HDFS
- issue #45: En huemul_BigDataGovernance se agrega método hiveTable_exists que retorna true si la base de datos y tabla existe en Hive
- issue #45: En huemul_Table se agrega método getEmptyTable que retorna un DataFrame vacío con la estructura definida en la tabla, y crea una vista temporal con el nombre indicado en Alias
- issue #48: En modelo de control de DataQuality ahora se registra la duración de aplicar la regla, y se determina si la regla generó como resultado un warning o un error.
- issue #49: En huemul_Control agrega método getDQResult(), el cual retorna el resultante de la ejecución de Data Quality en un arreglo de datos, con la estructura del modelo de control
- issue #49: En huemul_BigDataGovernance agrega método getPath(), el cual retorna el path indicado para una configuración específica.
- issue #50: En huemul_control se agrega método para indicar un código externo de Glosario de Negocio.
Resumen cambios de comportamiento:
- Ajustes al generador de código: Se adapta para incorporar los cambios de este release
- issue #44: El método DF_from_DF recibe un nuevo parámetro "AliasFrom: String", ahora queda de la siguiente forma: DF_from_DF(DFFrom: DataFrame, AliasFrom: String, AliasTo: String).
- issue #48: El atributo isError tendrá el valor true solo cuando algunas de las reglas haya fallado, y la clasificación de esa regla sea "ERROR", en caso que la clasificación sea "WARNING" no contendrá valor. El comportamiento anterior no discriminaba si era "ERROR" o "WARNING".
- issue #35: Se debe ejecutar script de actualización del modelo de control por compatibilidad del modelo de control de procesos con Oracle.
- Se cambia de mayúscula a minúscula algunos nombres de métodos y atributos.
A continuación se detallas los cambios de este release en cada clase.
Las siguientes clases y funciones tienen mejoras/cambios:
Clase huemul_BigDataGovernance:
- issue #34 huemul_showDemoLines(value: Boolean): Habilitar o deshabilitar el despliegue de 2 líneas de ejemplo al abrir un archivo RAW. Por default contiene el valor "true", de tal forma de mantener el comportamiento con versiones anteriores.
//En este ejemplo, se deshabilita la muestra de 2 líneas de ejemplo al leer cualquier archivo RAW
huemul_showDemoLines(false)
- issue #45 hdfsPath_exists(path: String): Boolean. Retorna true si la ruta indicada existe en el directorio HDFS
if (huemulLib.hdfsPath_exists("hdfs:///user/data/production/temp/")
println("existe")
- issue #45 hiveTable_exists(database_name: String, table_name: String): Boolean. Retorna true si la base de datos y tabla existe en Hive
if (huemulLib.hiveTable_exists("production_master", "tbl_DatosBasicos_mes"))
println("tabla existe")
- (issue #49) getPath(pathFromGlobal: ArrayBuffer[huemul_KeyValuePath]): String: Retorna el path específico según el esquema entregado.
//Retorna el path donde se almacenan los backup de tablas maestras
val ruta = getPath(GlobalSettings.MDM_Backup_Path)
Clase huemul_Tables:
- issue #16 setSaveBackup(value: Boolean): Permite respaldar el contenido de la tabla. Este backup se ejecuta cada vez que se producen cambios en la tabla, y guarda la versión anterior (es decir, antes de ser procesada). Por default esta opción está deshabilitada, por tanto se debe indicar en forma explícita..
class tbl_DatosBasicos(HuemulLib: huemul_BigDataGovernance, Control: huemul_Control) extends huemul_Table(HuemulLib,Control) with Serializable {
...
this.setSaveBackup(true)
...
this.ApplyTableDefinition()
}
- issue #44 DF_from_RAW(dataLake_RAW: huemul_DataLake, AliasTo: String). Permite asignar un DataFrame externo al objeto huemul_Table, y registrar el linaje de datos a nivel de cada campo.
val DF_RAW_final = new raw_DatosOldValue(huemulLib, Control)
if (!DF_RAW_final.open("DF_RAW_final", Control, Ano.toInt, Mes.toInt, 1, 0, 0, 0,"fin")) {
Control.RaiseError(s"Error al intentar abrir archivo de datos fin: ${DF_RAW.Error.ControlError_Message}")
}
TablaMaster.DF_from_RAW(DF_RAW, "DF_Original")
- issue #44 DF_from_DF(DFFrom: DataFrame, AliasFrom: String, AliasTo: String). Modificación vs versiones anteriores. Permite asignar un DataFrame externo al objeto huemul_Table. En esta versión, se agrega el parámetro "AliasFrom: String", el cual enlaza el Alias de SQL anterior con el nuevo Alias SQL, de esta forma se crea el linaje de datos.
val DF_RAW_final = new raw_DatosOldValue(huemulLib, Control)
if (!DF_RAW_final.open("DF_RAW_final", Control, Ano.toInt, Mes.toInt, 1, 0, 0, 0,"fin")) {
Control.RaiseError(s"Error al intentar abrir archivo de datos fin: ${DF_RAW.Error.ControlError_Message}")
}
TablaMaster.DF_from_DF(DF_RAW.DataFramehuemul.DataFrame, "DF_RAW_final", "DF_Original")
- issue #45 getEmptyTable(Alias: String): DataFrame. Retorna un DataFrame vacío con la estructura definida en la tabla, y crea una vista temporal con el nombre indicado en Alias
val TablaMaster = new tbl_DatosBasicos(huemulLib,
val df_temp_vacia = TablaMaster.getEmptyTable("pruebaVacia")
df_temp_vacia.show()
Clase huemul_Columns:
- (issue #38) setMDM_EnableOldValue_FullTrace(value: Boolean): Indica que se guardará la historia de todos los cambios sufridos por un campo en particular.
val Monto = new huemul_Columns(IntegerType,true,"datos Monto")
Monto.setMDM_EnableOldValue_FullTrace( true)
- issue #50 setBusinessGlossary_Id(value: String): permite registrar un código del concepto de negocio asociado al campo. .
val cliente_nombre = new huemul_Columns(StringType,true,"primer nombre del cliente")
cliente_nombre.setBusinessGlossary_Id("BG_0015")
Clase huemul_Control:
- issue #49 getDQResult(): Retorna el resultante de la ejecución de Data Quality en un arreglo de datos, con la estructura del modelo de control.
val Resultado = Control.getDQResult()
Clase huemul_DataQuality: Se agrega opción de incluir un ID externo de regla de Calidad de Datos, se puede hacer de dos formas, las cuales son abordadas por el issue #43.
- issue #43 Constructor: Se agrega nuevo parámetro al final del constructor, que permite incluir un Id Externo que identifique una regla de DQ específica
val DQ_Regla = new huemul_DataQuality(CampoDeTabla,"Valida completitud del campo","CampoDeTabla in (1,2,3,4,5)",1,huemulType_DQQueryLevel.row, huemulType_DQNotification.WARNING, true, **"EC_002"** )
- issue #43 setDQ_ExternalCode(value: String): incluir un Id Externo que identifique una regla de DQ específica
val Resultado = Control.getDQResult()
Clase huemul_DataQualityResult:
- issue #48 isWarning: Boolean: Nuevo atributo el cual indica si el resultado de todas las reglas de DQ aplicadas obtuvo warnings. El atributo isError tendrá el valor true solo cuando algunas de las reglas haya fallado, y la clasificación de esa regla sea "ERROR"
Clase huemul_DQRecord:
- issue #48 DQ_IsWarning: Boolean: Indica true cuando el resultado de la regla no es el esperado, y la regla en cuestión fue declarada como tipo Warning
- issue #48 DQ_duration_hour: Integer: retorna la cantidad de horas que se demoró en ejecutar la regla
- issue #48 DQ_duration_minute: Integer: retorna la cantidad de minutos que se demoró en ejecutar la regla
- issue #48 DQ_duration_second: Integer: retorna la cantidad de segundos que se demoró en ejecutar la regla
-
issue #48 Codificación de DataQuality: Se incorpora la siguiente codificación al ejecutar las reglas de DQ predefinidas por huemul:
- HUEMUL_DQ_001: foreing key
- HUEMUL_DQ_002: primary key
- HUEMUL_DQ_003: unique column
- HUEMUL_DQ_004: not null column
- HUEMUL_DQ_005: reg_exp validation for Column
- HUEMUL_DQ_006: string length DQ for Column
- HUEMUL_DQ_007: number range
- HUEMUL_DQ_008: DateTime range
Clase globalSettings:
- issue #16 MDM_Backup_Path(value: Boolean): Por default está habilitada la opción de guardar backup, por ello se debe incluir el path donde se almacenarán los archivos de backup.
//En este ejemplo, se habilita la opción de guardar y se identifica el path
Global.MDM_SaveBackup = false
Global.MDM_Backup_Path.append(new huemul_KeyValuePath("production","hdfs:///user/data/production/backup/"))
- issue #38 MDM_SaveOldValueTrace (value: Boolean): Habilita la trazabilidad de cambios en los valores de los campos para tablas de tipo master y reference. Adicionalmente, se crean los métodos MDM_OldValueTrace_DataBase y MDM_OldValueTrace_Path para especificar la base de datos en hive y path (respectivamente) donde se guardarán las estructuras de datos con la información histórica
//En este ejemplo, se habilita la opción de guardar y se identifica el path
Global.MDM_SaveOldValueTrace = true
Global.MDM_OldValueTrace_DataBase.append(new huemul_KeyValuePath("production","production_mdm_oldvalue"))
Global.MDM_OldValueTrace_DataBase.append(new huemul_KeyValuePath("experimental","experimental_mdm_oldvalue"))
Global.MDM_OldValueTrace_Path.append(new huemul_KeyValuePath("production","hdfs:///user/data/production/mdm_oldvalue/"))
Global.MDM_OldValueTrace_Path.append(new huemul_KeyValuePath("experimental","hdfs:///user/data/experimental/mdm_oldvalue/"))
Se implementan las siguientes correcciones:
- En modelo de control se duplica registro al intentar registrar dos veces el uso de una tabla en proceso. Se corrige cambiando la PK de tabla control_tablesuse.
A continuación se detallas los cambios de este release.
No hay nuevos comportamientos en esta versión
Las siguientes clases y funciones tienen mejoras:
Clase huemul_Control:
- TestPlan_CurrentIsOK(TotalOkExpected: Integer = null): Boolean (issue #33) Determina si todos los casos de prueba de la clase donde se ejecuta el modelo de control termina según lo esperado .
//Espera que se hayan ejecutado 10 casos de prueba en forma correcta, si el parámetro no se especifica, se espera que el 100% de los casos ejecutados hayan terminado de forma correcta
if (!control.TestPlan_CurrentIsOK(10)) {
//error
}
- TestPlan_IsOkById(TestPlanId: String, TotalProcessExpected: Integer ): Boolean (issue #33) verifica que "TotalProcessExpected" cantidad de clases hayan terminado correctamente el plan de pruebas, para ello se debe haber validado la ejecución del plan de pruebas de cada clase con el método TestPlan_CurrentIsOK .
//Espera que se hayan ejecutado 5 clases correctamente
if (!control.TestPlan_IsOkById("testplan_001",5)) {
//error
}
Se implementan las siguientes correcciones:
- Corrección de bug al almacenar detalle de filas con error en DQ.
A continuación se detallas los cambios de este release.
No hay nuevos comportamientos en esta versión
Las siguientes clases y funciones tienen las siguientes mejoras:
Clase huemul_BigDataGovernance:
- huemul_BigDataGovernance (appName: String, args: Array[String], globalSettings: huemul_GlobalPath, LocalSparkSession: SparkSession = null): Se agrega parámetro LocalSparkSession, lo cual permite al desarrollador enviar su propia sesión de spark. Esto permite mayor nivel de parametrización de Spark.
Clase huemul_Table:
- setNumPartitions: (issue #24) Indica el número de particiones que se almacena al escribir un archivo. El valor predeterminado es null, por tanto se determina en forma automática por Spark. En tablas pequeñas se recomienda que el número de particiones sea bajo (por ejemplo 2), de esta forma se evita el problema de los archivos pequeños de spark.
//Indica el número de particiones
setNumPartitions(2)
-
DF_from_SQL(Alias: String, sql: String, SaveInTemp: Boolean = true, NumPartitions: Integer = null): (issue #24) Se agrega parámetro NumPartitions para señalar la cantidad de particiones que utilizará spark para almacenar el resultado temporal del DataFrame.
-
executeFull(NewAlias: String, storageLevelOfDF: org.apache.spark.storage.StorageLevel = null): Agrega parámetro storageLevelOfDF. Esta mejora permite al desarrollador enviar el resultado del DataFrame final a memoria (por ejemplo usando MEMORY_ONLY), por tanto la ejecución de los procesos de DataQuality y validación de integridad referencia se reducen en forma importante. Esto es equivalente a usar el método DataFrame.persist(StorageLevel)
//Ejemplo de uso
TablaMaster.executeFull("DF_Final", org.apache.spark.storage.StorageLevel.MEMORY_ONLY )
- executeOnlyInsert(NewAlias: String, storageLevelOfDF: org.apache.spark.storage.StorageLevel = null): Agrega parámetro storageLevelOfDF. Esta mejora permite al desarrollador enviar el resultado del DataFrame final a memoria (por ejemplo usando MEMORY_ONLY), por tanto la ejecución de los procesos de DataQuality y validación de integridad referencia se reducen en forma importante. Esto es equivalente a usar el método DataFrame.persist(StorageLevel)
//Ejemplo de uso
TablaMaster.executeOnlyInsert("DF_Final", org.apache.spark.storage.StorageLevel.MEMORY_ONLY )
- executeOnlyUpdate(NewAlias: String, storageLevelOfDF: org.apache.spark.storage.StorageLevel = null): Agrega parámetro storageLevelOfDF. Esta mejora permite al desarrollador enviar el resultado del DataFrame final a memoria (por ejemplo usando MEMORY_ONLY), por tanto la ejecución de los procesos de DataQuality y validación de integridad referencia se reducen en forma importante. Esto es equivalente a usar el método DataFrame.persist(StorageLevel)
//Ejemplo de uso
TablaMaster.executeOnlyUpdate("DF_Final", org.apache.spark.storage.StorageLevel.MEMORY_ONLY )
- executeSelectiveUpdate(NewAlias: String, PartitionValueForSelectiveUpdate: String, storageLevelOfDF: org.apache.spark.storage.StorageLevel = null): Agrega parámetro storageLevelOfDF. Esta mejora permite al desarrollador enviar el resultado del DataFrame final a memoria (por ejemplo usando MEMORY_ONLY), por tanto la ejecución de los procesos de DataQuality y validación de integridad referencia se reducen en forma importante. Esto es equivalente a usar el método DataFrame.persist(StorageLevel)
//Ejemplo de uso
TablaMaster.executeSelectiveUpdate("DF_Final", "2019-05-01", org.apache.spark.storage.StorageLevel.MEMORY_ONLY )
Clase huemul_DataFrame:
- DF_from_SQL(Alias: String, sql: String, SaveInTemp: Boolean = true, NumPartitions: Integer = null): (issue #24) Se agrega parámetro NumPartitions para señalar la cantidad de particiones que utilizará spark para almacenar el resultado temporal del DataFrame.
A continuación el detalle de las mejoras sobre la versión:
-
Mensajes de fin de proceso en modo control off: Se muestra mensaje de término cuando RegisterInControl=false. El comportamiento anterior no mostraba el mensaje de término por consola.
-
Issue #25: Se agrega validación de las variables requeridas en GlobalSettings. Si alguna de las variables obligatorias no está con valor definido, el programa enviará un error controlado señalado el problema.
-
Issue #27: El modelo de control ahora agrega el tiempo transcurrido en el mensaje de término de procesos enviado por consola.
A continuación se detallas los cambios de este release.
Supongamos que tenemos la tabla tbl_nombre_tabla. Si al aplicar data quality sobre las filas de dicha tabla se detectan errores (error o warning), el detalle de las filas que no cumplen con la condición se guardan en una nueva tabla llamada tbl_nombre_tabla_dq (mismo nombre definido por el usuario, se agrega "_dq" al final. Esta tabla tiene las siguientes columnas adicionales:
- dq_control_id: Id del proceso que identifica la ejecución del modelo de control de huemul.
- dq_error_columnname: nombre de la columna sobre la cual se aplica la calidad de datos (puede estar en null, depende de la especificación del usuario)
- dq_error_notification: tipo de notificación (error o warning)
- dq_error_code: código de error devuelto (según lo indicado por usuario, o Id interno de huemul según sea el caso)
- dq_error_descripcion: descripción del error indicada por el usuario
El resto de las columnas son idénticas a las que contiene la tabla original.
Las siguientes clases y funciones han sufrido modificaciones:
Clase huemul_Table:
- setSaveDQResult: Nuevo método para indicar si la tabla guarda o no el detalle de errores en DataQuality. El valor por default es "true"
//para evitar guardar el detalle de los errores de DataQuality en la tabla
setSaveDQResult(false)
Clase huemul_DataQuality: Se agrega parámetro "SaveErrorDetails", valor por default "true". En caso de encontrar errores en DataQuality, guarda automáticamente el detalle en la tabla de detalle.
huemul_DataQuality(FieldName: huemul_Columns
,Description: String
,sqlformula: String
,Error_Code: Integer
,QueryLevel: huemulType_DQQueryLevel = huemulType_DQQueryLevel.Row //,IsAggregated: Boolean
,Notification: huemulType_DQNotification = huemulType_DQNotification.ERROR //RaiseError: Boolean
,SaveErrorDetails: Boolean = true
Se agrega la siguiente configuración:
- Nombre de base de datos en Hive para consultar el detalle
- ruta HDFS donde se almacenará detalle de filas con problemas de data quality
//DQ_ERROR SETTING
Global.DQ_SaveErrorDetails = true
Global.DQError_DataBase.append(new huemul_KeyValuePath("production","production_DQError"))
Global.DQError_DataBase.append(new huemul_KeyValuePath("other_environment","other_DQError"))
Global.DQError_Path.append(new huemul_KeyValuePath("production","hdfs:///user/data/production/dqerror/"))
Global.DQError_Path.append(new huemul_KeyValuePath("other_environment","hdfs:///user/data/other/dqerror/"))