HuemulSolutions / huemul-bigdatagovernance

Huemul BigDataGovernance, es una framework que trabaja sobre Spark, Hive y HDFS. Permite la implementación de una estrategia corporativa de dato único, basada en buenas prácticas de Gobierno de Datos. Permite implementar tablas con control de Primary Key y Foreing Key al insertar y actualizar datos utilizando la librería, Validación de nulos, largos de textos, máximos/mínimos de números y fechas, valores únicos y valores por default. También permite clasificar los campos en aplicabilidad de derechos ARCO para facilitar la implementación de leyes de protección de datos tipo GDPR, identificar los niveles de seguridad y si se está aplicando algún tipo de encriptación. Adicionalmente permite agregar reglas de validación más complejas sobre la misma tabla.
Apache License 2.0
11 stars 7 forks source link

Mejorar Trazabilidad de campos en procesos #44

Closed sebasrod closed 5 years ago

sebasrod commented 5 years ago

Implementar trazabilidad a nivel de campos, identificando cada query que se ejecuta dentro de un proceso, y mapeando con los campos de la query anterior

sebasrod commented 5 years ago

Para implementar esta funcionalidad, se crea un nuevo método para traspaso de DataFrame desde RAW (DF_from_RAW) y se agrega un parámetro obligatorio en método DF_from_DF.

  1. DF_from_RAW(dataLake_RAW: huemul_DataLake, AliasTo: String): Nuevo método. Permite asignar un DataFrame externo al objeto huemul_Table.
    
    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")


2. DF_from_DF(DFFrom: DataFrame, **AliasFrom: String**, AliasTo: String): Modificación de método. 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.
```scala
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")

Modelo de Control

Para registrar el linaje de datos a nivel de campos, se han agregado 3 tablas al modelo:

- control_query: Registra las querys ejecutadas en el proceso - control_querycolumn: Registra las columnas devueltas en cada query - control_querycolumnori: Registra el origen de datos para la creación de cada columna, enlazando con otra query, un archivo RAW o una tabla.

Para compatibilidad con versiones anteriores en postgres:

  1. Ejecutar el siguiente script en Postgres
    \i huemul_bdg_upgrade_1.4_to_2.0.sql

La sección del script que aplica este cambio contiene lo siguiente:

create table control_query (query_id         varchar(50)
                ,processexecstep_id      varchar(50)
                                ,processexec_id            varchar(50)      
                                ,rawfiles_id                   varchar(50)
                                ,rawfilesdet_id          varchar(50)
                                ,table_id                       varchar(50)
                                ,query_alias            varchar(200)
                                ,query_sql_from      varchar(4000)
                                ,query_sql_where        varchar(4000)
                                ,query_numerrors         int
                                ,query_autoinc           int
                                ,query_israw             int
                                ,query_isfinaltable      int
                                ,query_isquery           int
                                ,query_isreferenced      int
                                ,query_numrows_real  int
                                ,query_numrows_expected  int
                                ,query_duration_hour              int
                                ,query_duration_min      int
                                ,query_duration_sec      int             
                                ,error_id                              varchar(50)
                                ,mdm_fhcreate                   varchar(30)
                                ,mdm_processname           varchar(200)    
                                ,primary key (query_id)
                                );

create table control_querycolumn (querycol_id       varchar(50)
                         ,query_id          varchar(50)
                         ,rawfilesdet_id                varchar(50)
                         ,column_id                     varchar(50)
                         ,querycol_pos          int
                         ,querycol_name     varchar(200)
                         ,querycol_sql          varchar(4000)
                         ,querycol_posstart     int
                         ,querycol_posend       int
                         ,querycol_line         int
                         ,mdm_fhcreate               varchar(30)
                                             ,mdm_processname       varchar(200)    
                         ,primary key (querycol_id)
                                );

create index idx_control_querycolumn_i01 on control_querycolumn (query_id, querycol_name)                                

create table control_querycolumnori (querycolori_id         varchar(50)       
                            ,querycol_id                varchar(50)
                            ,table_idori                            varchar(50)
                            ,column_idori               varchar(50)
                            ,rawfilesdet_idori              varchar(50)
                            ,rawfilesdetfields_idori        varchar(50)
                            ,query_idori                varchar(50)
                            ,querycol_idori         varchar(50)
                            ,querycolori_dbname     varchar(200)
                            ,querycolori_tabname        varchar(200)
                            ,querycolori_tabalias       varchar(200)
                            ,querycolori_colname        varchar(200)    
                            ,querycolori_isselect       int
                            ,querycolori_iswhere        int
                            ,querycolori_ishaving       int
                            ,querycolori_isorder        int
                            ,mdm_fhcreate                        varchar(30)
                                                ,mdm_processname                varchar(200)    
                            ,primary key (querycolori_id)
                                );      

Obtener Linaje a partir de SQL

Para obtener el linaje de datos, se utiliza la librería huemul-sql-decode, el cual se debe incluir en el proyecto