-
Notifications
You must be signed in to change notification settings - Fork 7
Release Notes
Este nuevo release contiene lo siguiente:
-
issue #87: Creación de tablas externas en HIVE: Se agrega nueva opción en globalSettings para indicar conector JDBC de HIVE para crear metadata. Esta funcionalidad permite realizar las siguientes acciones:
- En caso de utilizar versiones Hortonworks 3.0.0 hasta 3.1.4, la metadata de spark está separada de Hive, por tanto las tablas creadas desde spark no son visibles en Hive.
- En caso de usar HBase: spark no permite crear tablas externas usando el SerDe de HBase. Para usar esta nueva funcionalidad, se deben agregar las siguientes líneas al código de globalSettings:
//Agregar variable con opciones de conexió JDBC para HIVE
val HIVE_Setting = new ArrayBuffer[huemul_KeyValuePath]()
HIVE_Setting.append(new huemul_KeyValuePath("production",getKeyFromFile(s"${localPath}prod-demo-setting-hive-connection.set")))
HIVE_Setting.append(new huemul_KeyValuePath("experimental",getKeyFromFile(s"${localPath}prod-demo-setting-hive-connection.set")))
//Para indicar el uso adicional de HIVE mediante JDBC para crear la metadata.
Global.externalBBDD_conf.Using_HIVE.setActive(true).setActiveForHBASE(true).setConnectionStrings(HIVE_Setting)
Cuando se activa esta opción, también se mantiene activa la creación de metadata usando Spark.
Para una instalación nueva, se deben realizar las siguientes acciones:
1. Instalar modelo de control de procesos: para ello ejecutar el siguiente script huemul_bdg_2.3 SQL
2. Incluir huemul_sql_decode.jar en la ejecución de spark-submit: Se requiere este JAR adicional para la generación del linaje a nivel de campos y track de querys. Descargar desde mvn repository
Este nuevo release contiene lo siguiente:
- issue #79: Eliminar Backup de tablas maestras y de referencia: Agrega método control_getBackupToDelete(numBackupToMaintain: Int): Boolean. Recibe el parámetro "numBackupToMaintain" que indica la cantidad de backup que se mantendrán en HDFS (los "N" más nuevos). El resto los elimina.
- issue #66: Integración con ORC: Se agrega soporte para almacenar tablas en formato ORC. El siguiente ejemplo permite almacenar una tabla en formato ORC:
class tbl_demo_ORC(huemulBigDataGov: huemul_BigDataGovernance, Control: huemul_Control) extends huemul_Table(huemulBigDataGov, Control) with Serializable {
/********** C O N F I G U R A C I O N D E L A T A B L A ****************************************/
//Tipo de tabla, Master y Reference son catalogos sin particiones de periodo
this.setTableType(huemulType_Tables.Master)
//Tipo de archivo que sera almacenado en HDFS
this.setStorageType(huemulType_StorageType.ORC)
...
-
issue #65: Integración con HBase: Se agrega soporte para almacenar tablas de referencia y maestras en HBase. Para guardar una tabla en HBase, se debe considerar lo siguiente:
- Solo se permite tablas de tipo "reference" y "master"
- Se debe especificar tipo de almacenamiento "HBase"
El siguiente ejemplo muestra la configuración para tabla de tipo HBase:
class tbl_demo_HBASE(huemulBigDataGov: huemul_BigDataGovernance, Control: huemul_Control) extends huemul_Table(huemulBigDataGov, Control) with Serializable {
/********** C O N F I G U R A C I O N D E L A T A B L A ****************************************/
//Tipo de tabla, Master y Reference son catalogos sin particiones de periodo
this.setTableType(huemulType_Tables.Master)
//Tipo de archivo que sera almacenado en HDFS
this.setStorageType(huemulType_StorageType.HBASE)
...
//en definición de columna, se agrega método setHBaseCatalogMapping(nomFamilia, nomCampoHBase)
val tu_columna = new huemul_Columns (StringType, true, "descripción de la columna", false).setHBaseCatalogMapping("nombre_familia","nombre_campo_en_hbase")
Debido a la naturaleza de HBase, se debe tener presente lo siguiente:
- HBase admite únicamente un campo como PK, en caso que la tabla definida tenga dos o más campos de PK, huemul creará uno nuevo concatenando los campos definidos por el usuario (esto solo en caso de que la tabla de usuario tenga una PK compuesta).
- HBase es eficiente para acceder a registros en particular, por tanto se sugiere que las tablas almacenadas como HBase sean pequeñas. En caso de crear tablas de mayor tamaño, o que el usuario realice muchas operaciones de agrupación, se recomienda otro tipo de almacenamiento (por ejemplo PARQUET u ORC).
En GlobalSettgins, se deben agregar las siguientes configuraciones:
- HIVE_Setting: indicar JDBC para conectar directamente con HIVE, esto se utiliza para la creación de la tabla externa de HIVE hacia HBase (Spark no tiene soporte para crear una tabla externa de HBase en HIVE).
- setHBase_available(): Habilita la conexión con HBase. Se debe invocar este método en GlobalSettings. Ejemplo:
Global.setHBase_available()
Global.HIVE_Setting.append(new huemul_KeyValuePath("production",getKeyFromFile(s"${localPath}prod-demo-setting-hive-connection.set")))
//Para indicar el uso adicional de HIVE mediante JDBC para crear la metadata (**actualizacion usando version 2.3**).
Global.externalBBDD_conf.Using_HIVE.setActive(true).setActiveForHBASE(true).setConnectionStrings(HIVE_Setting)
Finalmente, para poder utilizar el almacenamiento de HBase desde Spark, se deben incluir las librerías necesarias para tales efectos, algunas recomendaciones son las siguientes:
- Incluir hbase-site.xml en la ejecución: Incluir el siguiente parámetro
spark-submit --master yarn --files /etc/hbase/conf/hbase-site.xml
- Incluir librerías JARS en la ejecución: Es caso que estos ficheros no estén en el classPath de ejecución de spark, se deben incluir en --JARS
A continuación se dan como ejemplo las rutas para la ejecución sobre un ambiente HortonWorks.
* /usr/hdp/current/hbase-client/lib/hbase-server.jar
* /usr/hdp/current/hbase-client/lib/hbase-spark.jar
* /usr/hdp/current/hbase-client/lib/hbase-common.jar
* /usr/hdp/current/hbase-client/lib/hbase-client.jar
* /usr/hdp/current/hbase-client/lib/hbase-protocol.jar
* /usr/hdp/current/hbase-client/lib/hbase-annotations.jar
* /usr/hdp/current/hbase-client/lib/hbase-hadoop-compat.jar
* /usr/hdp/current/hbase-client/lib/hbase-hadoop2-compat.jar
* /usr/hdp/current/hive-client/lib/hive-hbase-handler.jar
* /usr/hdp/current/hbase-client/lib/metrics-core-2.2.0.jar
para actualizar a esta nueva versión, se deben realizar las siguientes acciones:
1. Actualizar modelo de control de procesos: para ello ejecutar el siguiente script huemul_bdg_upgrade_2.1_to_2.2.sql
2. Agregar configuración en globalSettings: Incluir la siguiente configuración opcional en el proyecto.
//Agrega configuración para establecer conexión con HIVE usando JDBC, esto se utiliza para crear tablas externas de HIVE hacia HBase.
Global.HIVE_Setting.append(new huemul_KeyValuePath("production",getKeyFromFile(s"${localPath}prod-demo-setting-hive-connection.set")))
Global.HIVE_Setting.append(new huemul_KeyValuePath("experimental",getKeyFromFile(s"${localPath}prod-demo-setting-hive-connection.set")))
Global.setHBase_available() //Habilita la conexión con HBase
Para una instalación nueva, se deben realizar las siguientes acciones:
1. Instalar modelo de control de procesos: para ello ejecutar el siguiente script huemul_bdg_2.2 SQL
2. Incluir huemul_sql_decode.jar en la ejecución de spark-submit: Se requiere este JAR adicional para la generación del linaje a nivel de campos y track de querys. Descargar desde mvn repository
A continuación se detallas los cambios de este release en cada clase.
Las siguientes clases y funciones tienen mejoras/cambios:
Clase huemul_Columns:
- issue #65 El nuevo método setHBaseCatalogMapping(df: String, col: String = null): huemul_Columns, permite configurar la familia y nombre de campo en la tabla de HBase
Este nuevo release contiene lo siguiente:
- issue #56: Incorpora opción para dejar registros en detalle de DQ cuando se utiliza el método executeOnlyInsert
-
issue #58: Excluye registros que no cumplen con condiciones de DQ (con huemul_DataQuality y FK), para ello se agrega el tipo WARNING_EXCLUDE, quedando los tres tipos de notificación de la siguiente forma:
- huemulType_DQNotification.WARNING_ERROR: Genera un error que detiene la ejecución.
- huemulType_DQNotification.WARNING_EXCLUDE(nuevo): Genera un warning, excluye los registros que no cumplen con la condición (son almacenados en la tabla [nombre_tabla]_dq), y la ejecución continúa con el resto de las filas.
- huemulType_DQNotification.WARNING: Se genera un warning, los registros con fallas son almacenados en la tabla detallada de DQ (en caso de estar activa) y la ejecución continúa con el 100% de las filas (buenas y malas).
- issue #60: Incluye Id de DQ en la tabla de detalle de DQ: permite enlazar modelo de control con detalle de DQ
- issue #62: Incorpora detalle del avance en las reglas de DQ, y posibilidad de separar la ejecución para ambientes pequeños.
- issue #64: Crea método savePersistToDisk para guardar el resultado de un DF en HDFS
- issue #68: Permite crear cache de metadata de HIVE para mejorar tiempo de respuesta al inicio de ejecución.
- issue #71: Incorpora versión del modelo de control para mejorar la compatibilidad entre versiones.
- issue #72: Guarda la versión de huemul y modelo de control ejecutados en la tabla control_processExec
- issue #73: Parametrizar los códigos de error externos para PK y FK
- issue #63: Optimización de código:
Para actualizar a esta nueva versión, se deben realizar las siguientes acciones:
1. Actualizar modelo de control de procesos: para ello ejecutar el siguiente script huemul_bdg_upgrade_2.0_to_2.1.sql
2. Agregar configuración en globalSettings: Incluir la siguiente configuración opcional en el proyecto.
Global.HIVE_HourToUpdateMetadata = 5 //indica la cantidad de horas para refrescar el cache de metadata obtenido desde HIVE
Para una instalación nueva, se deben realizar las siguientes acciones:
1. Instalar modelo de control de procesos: para ello ejecutar el siguiente script huemul_bdg_2.1 SQL
2. Incluir huemul_sql_decode.jar en la ejecución de spark-submit: Se requiere este JAR adicional para la generación del linaje a nivel de campos y track de querys. Descargar desde mvn repository
A continuación se detallas los cambios de este release en cada clase.
Las siguientes clases y funciones tienen mejoras/cambios:
Clase huemul_DataFrame:
-
issue #64 El nuevo método savePersistToDisk permite guardar los resultados de un DF en formato parquet, recibe los siguientes parámetros:
- OverriteIfExist: Boolean: Indica si debe sobreescribir el contenido anterior de la tabla (true), de lo contrario (false), agrega el nuevo contenido al ya existente.
- tableNameInHive: String: Indica el nombre que tendrá la tabla en Hive. El mismo nombre es utilizado para crear la estructura parquet.
- localPath: String: Indica la ruta local donde se guardarán los datos, esto a partir de la ruta global.
- globalPath: ArrayBuffer[huemul_KeyValuePath]: ruta global donde se guardará el fichero parquet (ruta definida en globalSettings). Este parámetro es opcional, en caso de no especificar se toma la ruta definida en SANDBOX_BigFiles_Path.
- databaseName: ArrayBuffer[huemul_KeyValuePath: Este parámetro es opcional e indica la base de datos donde se creará la tabla en hive. En caso de no especificar, la tabla será creada en la base de datos Sandbox (SANDBOX_DataBase).
Ejemplo: el siguiente ejemplo muestra la apertura de un archivo RAW de taxis de NewYork, el dataFrame resultante es guardado en disco con el nombre "taxi_yellow_${param_year}_${param_month}"
var DF_RAW = new yellow_tripdata_mes(huemulBigDataGov, Control)
if (!DF_RAW.open("DF_RAW", Control, param_year, param_month, 1, 0, 0, 0))
Control.RaiseError(s"error encontrado, abortar: ${DF_RAW.Error.ControlError_Message}")
Control.NewStep("Guardando datos en bruto en sandbox")
DF_RAW.DataFramehuemul.savePersistToDisk(true, s"taxi_yellow_${param_year}_${param_month}", "taxi") //, globalPath, databaseName)
Clase huemul_Table:
-
issue #73 implementa el método setPK_externalCode(value: String): Indica el código externo para indicar la validación de PK sobre la tabla.
-
issue #56 El método executeOnlyInsert de huemul_table tiene tres variantes
def executeOnlyInsert(NewAlias: String, storageLevelOfDF: org.apache.spark.storage.StorageLevel = null): Boolean --> compatible con versiones anteriores
def executeOnlyInsert(NewAlias: String, RegisterOnlyInsertInDQ: Boolean): Boolean --> nueva variante, requiere el parámetro RegisterOnlyInsertInDQ
def executeOnlyInsert(NewAlias: String, storageLevelOfDF: org.apache.spark.storage.StorageLevel, RegisterOnlyInsertInDQ: Boolean): Boolean --> nueva variante, requiere los parámetros storageLevelOfDF (antiguo) y RegisterOnlyInsertInDQ (nuevo parámetro).
El valor por default para el nuevo parámetro RegisterOnlyInsertInDQ es false, de esta forma se mantiene compatibilidad con versiones anteriores.
- issue #58 Se agrega el método setSaveDQErrorOnce(value: Boolean), el valor true indica que guardará el resultado de DQ de una sola vez, acumulando todos los resultados en un DF, mientras que el valor false indica que guardará el detalle de DQ cada vez que lo detecta. El valor false permite usar menos memoria en el ambiente, sin embargo graba mas veces en disco. El valor por default es true.
Clase huemul_Table_Relationship:
- issue #73 implementa los siguientes métodos:
- setExternalCode(value: String): huemul_Table_Relationship: Indica el código externo para indicar la validación de FK.
Ejemplo:
val itbl_DatosBasicos = new tbl_DatosBasicos(HuemulLib,Control)
val fk_tbl_DatosBasicos = new huemul_Table_Relationship(itbl_DatosBasicos, false).setExternalCode("USER_FK_CODE")
fk_tbl_DatosBasicos.AddRelationship(itbl_DatosBasicos.TipoValor , TipoValor)
- issue #58 Se agrega el método setNotification(value: huemulType_DQNotification), el cual indica el nivel de criticidad de la validación de FK
Ejemplo en FK:
val itbl_DatosBasicos = new tbl_DatosBasicos(HuemulLib,Control)
val fk_tbl_DatosBasicos = new huemul_Table_Relationship(itbl_DatosBasicos, false).setNotification(huemulType_DQNotification.WARNING_EXCLUDE).broadcastJoin(true)
fk_tbl_DatosBasicos.AddRelationship(itbl_DatosBasicos.TipoValor , TipoValor)
El valor por default es "ERROR", de esta forma se mantiene el comportamiento y compatibilidad con versiones anteriores. las opciones ahora son las siguientes:
- huemulType_DQNotification.WARNING_ERROR: Genera un error que detiene la ejecución.
- huemulType_DQNotification.WARNING_EXCLUDE: Genera un warning, excluye los registros que no cumplen con la condición (son almacenados en la tabla [nombre_tabla]_dq), y la ejecución continúa con el resto de las filas.
- huemulType_DQNotification.WARNING: Se genera un warning, los registros con fallas son almacenados en la tabla detallada de DQ (en caso de estar activa) y la ejecución continúa con el 100% de las filas (buenas y malas).
Clase huemul_Columns:
-
issue #73 implementa los siguientes métodos:
-
setIsUnique(externalCode: String = null): huemul_Columns: Indica que campo es parte de la PK, y en parámetro indica código externo. Este método reemplazará al método setIsUnique(value: Boolean), el cual será deprecado en la versión 3.0
-
setNullable(externalCode: String = null): huemul_Columns: Indica que campo permite nulos, y en parámetro indica código externo. Este método reemplazará al método setNullable(value: Boolean), el cual será deprecado en la versión 3.0
-
setDQ_MinLen(value: Integer, externalCode: String = null): huemul_Columns: Indica el largo mínimo del campo, en el segundo parámetro indica código externo. Este método reemplazará al método setDQ_MinLen(value: Integer), el cual será deprecado en la versión 3.0
-
setDQ_MaxLen(value: Integer, externalCode: String = null): huemul_Columns: Indica el largo máximo del campo, en el segundo parámetro indica código externo. Este método reemplazará al método setDQ_MaxLen(value: Integer), el cual será deprecado en la versión 3.0
-
setDQ_MinDecimalValue(value: Decimal, externalCode: String = null): huemul_Columns: Indica el valor decimal mínimo para el campo, en el segundo parámetro indica código externo. Este método reemplazará al método setDQ_MinDecimalValue(value: Decimal), el cual será deprecado en la versión 3.0
-
setDQ_MaxDecimalValue(value: Decimal, externalCode: String = null): huemul_Columns: Indica el valor decimal máximo para el campo, en el segundo parámetro indica código externo. Este método reemplazará al método setDQ_MaxDecimalValue(value: Decimal), el cual será deprecado en la versión 3.0
-
setDQ_MinDateTimeValue(value: String, externalCode: String = null): huemul_Columns: Indica el valor mínimo de fecha y hora aceptado, en el segundo parámetro indica código externo. Este método reemplazará al método setDQ_MinDateTimeValue(value: String), el cual será deprecado en la versión 3.0
-
setDQ_MaxDateTimeValue(value: String, externalCode: String = null): huemul_Columns: Indica el valor máximo de fecha y hora aceptado, en el segundo parámetro indica código externo. Este método reemplazará al método setDQ_MaxDateTimeValue(value: String), el cual será deprecado en la versión 3.0
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.
Para actualizar a esta nueva versión, se deben realizar las siguientes acciones:
1. Actualizar modelo de control de procesos: para ello ejecutar el siguiente script huemul_bdg_upgrade_1.4_to_2.0.sql
2. Agregar configuración en globalSettings: Incluir la siguiente configuración adicional en el proyecto (reemplazar valores de "database" y "path" según corresponda.
//BACKUP
Global.MDM_SaveBackup = true
Global.MDM_Backup_Path.append(new huemul_KeyValuePath("production","hdfs:///user/data/production/backup/"))
Global.MDM_Backup_Path.append(new huemul_KeyValuePath("experimental","hdfs://hdfs:///user/data/experimental/backup/"))
//DATA QUALITY PATH & DATABASE
Global.DQ_SaveErrorDetails = true
Global.DQError_DataBase.append(new huemul_KeyValuePath("production","production_master"))
Global.DQError_DataBase.append(new huemul_KeyValuePath("experimental","experimental_master"))
Global.DQError_Path.append(new huemul_KeyValuePath("production","hdfs:///user/data/production/dq/"))
Global.DQError_Path.append(new huemul_KeyValuePath("experimental","hdfs://hdfs:///user/data/experimental/dq/"))
//MDM OLD VALUE FULL TRACE PATH & DATABASE
Global.MDM_SaveOldValueTrace = true
Global.MDM_OldValueTrace_DataBase.append(new huemul_KeyValuePath("production","production_oldvalue"))
Global.MDM_OldValueTrace_DataBase.append(new huemul_KeyValuePath("experimental","experimental_oldvalue"))
Global.MDM_OldValueTrace_Path.append(new huemul_KeyValuePath("production","hdfs:///user/data/production/oldvalue/"))
Global.MDM_OldValueTrace_Path.append(new huemul_KeyValuePath("experimental","hdfs://hdfs:///user/data/experimental/oldvalue/"))
3. Incluir huemul_sql_decode.jar en la ejecución de spark-submit: Se requiere este JAR adicional para la generación del linaje a nivel de campos y track de querys. Descargar desde mvn repository
Para una instalación nueva, se deben realizar las siguientes acciones:
1. Instalar modelo de control de procesos: para ello ejecutar el siguiente script huemul_bdg_2.0 SQL
2. Incluir huemul_sql_decode.jar en la ejecución de spark-submit: Se requiere este JAR adicional para la generación del linaje a nivel de campos y track de querys. Descargar desde mvn repository
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/"))