Closed huemulDeveloper closed 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:
dropBeforeInsert=true solo borra particiones de datos que contiene el archivo que se está cargando: supongamos que tenemos las siguientes particiones:
En el caso que tengamos un nuevo archivo archivo 20170502_com03_4.txt con los siguientes datos
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)
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