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

Opción para agregar columnas particionadas en tablas master y reference #98

Closed huemulDeveloper closed 4 years ago

huemulDeveloper commented 4 years ago

Actualmente las particiones solo están implementadas para las tablas de tipo transaccional.

El objetivo es poder implementar particiones sobre tablas maestras y de referencia, de tal forma que permita mejorar la performance para tablas maestras que pueden ser de gran volúmen (> 10 millones de filas) y evitar los fullscan

huemulDeveloper commented 4 years ago

Implementación se hace sobre tablas maestras, de referencia y transaccionales. Considerar esta mejora para tablas tipo PARQUET, AVRO Y ORC. Para el caso de tablas en formato DELTA, la recomendación es habilitar solo una partición (https://docs.databricks.com/delta/porting.html).

Se implementa nuevo método que permite configurar a nivel de cada columna:

Ejemplo

  val periodo: huemul_Columns = new huemul_Columns(DateType,true,"Periodo de los datos")
                            .setIsPK().setPartitionColumn(1,false, true)
  val empresa: huemul_Columns = new huemul_Columns(StringType,true,"Empresa que registra ventas")
    .setPartitionColumn(2,true, false)
  val app: huemul_Columns = new huemul_Columns(StringType,true,"app que registra ventas")
    .setPartitionColumn(3,false, false)
  val producto: huemul_Columns = new huemul_Columns(StringType,true,"producto de la venta")
  val cantidad: huemul_Columns = new huemul_Columns(IntegerType,true,"Cantidad de productos vendidos")

En este ejemplo, se define una tabla con 4 columnas, con 3 columnas particionadas, el ejemplo y comportamiento de cada una de ellas se explica a continuación:

Tenemos un archivo diario de ventas de productos por empresa con la siguiente estructura y datos de ejemplo: archivo 20170501_com01.txt periodo empresa app producto cantidad 20170501 com01 internet chocolate 10 20170501 com01 tienda dulce 2

archivo 20170501_com02.txt periodo empresa app producto cantidad 20170501 com02 internet alfajor 5 20170501 com02 tienda jugo 3

archivo 20170502_com03_4.txt periodo empresa app producto cantidad 20170502 com03 internet flan 8 20170502 com04 tienda platano 6

El objetivo es poder cargar en la tabla estos archivos de forma independiente, debido a que llegan en distintos momentos del día, y se requiere generar un proceso eficiente de carga y consulta.

Por tanto, en nuestra tabla de tipo transaction definiremos tres columnas particionadas

En el último campo particionado, es indistinto usar el atributo dropBeforeInsert=true, debido a que siempre se borrará la partición específica de los valores de "empresa".

Consideraciones:

archivo 20170502_com03_4_v2.txt periodo empresa app producto cantidad 20170502 com03 internet flan 8 20170502 com04 tienda platano 6 20170502 com02 tienda manzana 7

Las acciones sobre las particiones se explican a continuación:

 * periodo=2017-05-01/empresa=com01/app=internet   (sin impacto)
 * periodo=2017-05-01/empresa=com01/app=tienda     (sin impacto)       
 * periodo=2017-05-01/empresa=com02/app=internet   (sin impacto)
 * periodo=2017-05-01/empresa=com02/app=tienda     (sin impacto)
 * periodo=2017-05-02/empresa=com03/app=internet   (elimina antigua, crea nuevamente)
 * periodo=2017-05-02/empresa=com04/app=tienda     (elimina antigua, crea nuevamente)
 * periodo=2017-05-02/empresa=com02/app=tienda     (nueva partición)