¿Cómo cargar archivos sin delimitador en Redshift?
Cargar archivos de datos suele ser una tarea crítica en ambientes de bases de datos, y Amazon Redshift no es la excepción. Muchos datos se encuentran en archivos donde las columnas están delimitadas por espacios fijos, en lugar de un delimitador claro como comas o tabulaciones. ¿Cómo manejar estos casos sin tropezar? Es más sencillo de lo que imaginas.
¿Cómo especificar el formato de columnas con espacios fijos?
Para cargar archivos en Redshift cuyo formato tiene columnas delimitadas por espacios fijos, debes especificar la longitud exacta que ocupa cada columna. El método para ello, aunque pueda parecer intimidante al inicio, se resume en indicar los rangos de cada campo:
Aquí, FIXEDWIDTH señala que la primera columna ocupa un solo espacio de longitud, la segunda y tercera ocupan nueve, la cuarta dos, y la quinta diez.
¿Qué ventajas tiene usar archivos de manifiesto?
El uso de archivos de manifiesto es otra potente característica de Redshift, especialmente cuando se manipulan múltiples archivos a la vez. En lugar de procesar cada archivo por separado, un archivo de manifiesto te permite gestionar todo en una sola operación.
¿Cómo funcionan los archivos de manifiesto?
Un archivo de manifiesto es básicamente un documento JSON que dicta qué archivos cargar y desde dónde. Este te ayuda a especificar condiciones como si el cargue del archivo es obligatorio o no:
Con esta técnica, puedes cargar múltiples archivos distribuidos en diferentes carpetas o buckets.
¿Cómo optimizar la carga de datos con compresión automática?
Redshift tiene una funcionalidad que permite optimizar automáticamente la carga de datos con compresión, utilizándola se aseguran los niveles más altos de desempeño y eficiencia.
¿Qué es la compresión automatizada con COPY?
El comando COPY puede analizar los datos durante la carga y ajustar la estructura de la tabla para aplicar las mejores técnicas de compresión posibles. Se realiza mediante el uso de la opción COMPUPDATE:
Determine los algoritmos óptimos de compresión para cada columna.
Vuelva a crear y cargar los datos con esta nueva configuración eficiente.
Utilizar el comando de compresión automática garantiza no solo almacenamiento óptimo, sino también mejoras sustanciales en el rendimiento de consultas.
Con estas técnicas, cargar datos en Redshift, sin importar su origen o formato, se vuelve una tarea gestionable y eficiente. Estas prácticas no solo mejoran la agilidad al manejar datos, sino que también optimizan el almacenamiento y acceso a los mismos. Sigue explorando estas opciones y adapta cada técnica a tu flujo de trabajo para maximizar los beneficios.
El comando fixedwidth indica el numero de columna + dos puntos + numero de caracteres utilizados.
Un archivo de manifiesto indica donde se desea cargar los archivos.
copy estudiante FROM's3://mibucketredshift/tercer_cargue.csv'credentials 'aws_iam_role=arn:aws:iam::XXXXXX:role/MiRolRedshift'region 'us-east-2'fixedwidth '0:1,1:9,2:9,3:2,4:10'dateformat 'mm-dd-yyyy';{"entries":[{"url":"s3://mibucketredshift/cargue_1.csv","mandatory":true},{"url":"s3://mibucketredshift/cargue_2.csv","mandatory":true}]}copy estudiante FROM's3://mibucketredshift/test.manifest'credentials 'aws_iam_role=arn:aws:iam::XXXXXX:role/MiRolRedshift'delimiter ';'ignoreheader 1manifest
region 'us-east-2';copy sales_compression_on FROM's3://mibucketredshift/sales_tab.txt'credentials 'aws_iam_role=arn:aws:iam::XXXXXX:role/MiRolRedshift'delimiter '\t' timeformat 'MM/DD/YYYY HH:MI:SS'COMPUPDATEON region 'us-east-2';copy sales_compression_off FROM's3://mibucketredshift/sales_tab.txt'credentials 'aws_iam_role=arn:aws:iam::XXXXXX:role/MiRolRedshift'delimiter '\t' timeformat 'MM/DD/YYYY HH:MI:SS'COMPUPDATEOFF region 'us-east-2';SELECT*FROM pg_table_def
WHERE tablename ='sales_compression_on';SELECT*FROM pg_table_def
WHERE tablename ='sales_compression_off';
Poderosísima herramienta Redshift
Manifiestos y Uso de COMPUPDATE para Carga con Compresión Automática en Amazon Redshift
Amazon Redshift proporciona herramientas avanzadas para manejar cargas de datos de manera eficiente, aprovechando el uso de manifiestos y la opción COMPUPDATE para compresión automática. A continuación, desglosamos estos conceptos, su implementación y mejores prácticas.
Manifiestos en Amazon Redshift
Un manifiesto es un archivo en formato JSON que contiene una lista de objetos almacenados en Amazon S3 para ser cargados a una tabla de Redshift. Los manifiestos son útiles cuando se trabaja con grandes volúmenes de datos distribuidos en múltiples archivos o carpetas.
Ventajas del Uso de Manifiestos
Control de Archivos: Garantiza que solo se carguen los archivos especificados.
Evita Duplicados: Previene la carga de archivos no deseados.
Manejo de Errores: Define si la carga debe fallar si un archivo específico no está disponible.
Formato del Archivo de Manifiesto
Un manifiesto típico tiene la siguiente estructura:
mandatory: Define si el proceso debe fallar si el archivo no está disponible (true) o continuar (false).
Uso en el Comando COPY
El manifiesto se especifica con la opción MANIFEST en el comando COPY:
COPY table_name
FROM 's3://my-bucket/path-to-manifest/manifest.json'
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRole'
REGION 'us-west-2'
MANIFEST;
COMPUPDATE: Compresión Automática
La opción COMPUPDATE del comando COPY permite que Redshift analice automáticamente los datos cargados y aplique algoritmos de compresión óptimos a las columnas de la tabla.
Modos de COMPUPDATE
COMPUPDATE ON(por defecto): Redshift ajusta las columnas para usar el mejor algoritmo de compresión basado en los datos cargados.
COMPUPDATE OFF: Desactiva el ajuste de compresión durante la carga. Útil si las columnas ya tienen compresión definida.
COMPUPDATE PRESET: Aplica configuraciones de compresión preexistentes, sin analizar los datos.
Beneficios de COMPUPDATE
Optimización Automática: Reduce el espacio de almacenamiento utilizado.
Mejora el Desempeño: Las consultas son más rápidas en tablas comprimidas.
Facilidad de Uso: Redshift maneja la elección de algoritmos sin intervención manual.
Ejemplo Completo: Manifiestos y COMPUPDATE
Supongamos que tenemos datos en múltiples archivos comprimidos en S3, listados en un manifiesto. Para cargarlos con compresión automática:
COPY sales_table
FROM 's3://my-bucket/sales-data/manifest.json'
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRole'
REGION 'us-west-2'
MANIFEST
COMPUPDATE ON
GZIP;
MANIFEST: Utiliza el archivo de manifiesto.
COMPUPDATE ON: Redshift ajusta automáticamente la compresión.
GZIP: Indica que los archivos están comprimidos en formato GZIP.
Buenas Prácticas
Preanalizar Compresión: Antes de cargar datos, utiliza ANALYZE COMPRESSION para determinar los algoritmos de compresión óptimos:ANALYZE COMPRESSION table_name;
Usar Manifiestos para Archivos Grandes: Divide los datos en archivos más pequeños y utiliza un manifiesto para manejarlos eficientemente.
Desactivar COMPUPDATE en Tablas Optimizadas: Si la tabla ya está configurada con compresión óptima, desactiva COMPUPDATE para ahorrar tiempo.
Monitorizar Cargas: Revisa tablas de sistema como stl_load_commits y stl_load_errors para verificar el estado de las cargas.
Asegurar Permisos en S3: Confirma que los roles de IAM tienen acceso a los archivos especificados en el manifiesto.
Resumen
Manifiestos: Ayudan a controlar la carga de datos desde múltiples archivos en S3.
COMPUPDATE: Optimiza automáticamente la compresión de columnas durante la carga.
Combinación Poderosa: Usar ambos en conjunto asegura cargas eficientes y tablas optimizadas para consultas rápidas.
Implementar estas herramientas en tu flujo de trabajo mejora significativamente la eficiencia y el desempeño en Amazon Redshift. 🚀
CREATETABLEIFNOTEXISTSpublic.sales_compression_on( salesid INTEGERNOTNULLENCODE raw
,listid INTEGERNOTNULLENCODE raw
,sellerid INTEGERNOTNULLENCODE raw
,buyerid INTEGERNOTNULLENCODE raw
,eventid INTEGERNOTNULLENCODE raw
,dateid SMALLINTNOTNULLENCODERAW,qtysold SMALLINTNOTNULLENCODE raw
,pricepaid NUMERIC(8,2)ENCODE raw
,commission NUMERIC(8,2)ENCODE raw
,saletime TIMESTAMPWITHOUTTIMEZONEENCODE raw
);CREATETABLEIFNOTEXISTSpublic.sales_compression_off( salesid INTEGERNOTNULLENCODE raw
,listid INTEGERNOTNULLENCODE raw
,sellerid INTEGERNOTNULLENCODE raw
,buyerid INTEGERNOTNULLENCODE raw
,eventid INTEGERNOTNULLENCODE raw
,dateid SMALLINTNOTNULLENCODERAW,qtysold SMALLINTNOTNULLENCODE raw
,pricepaid NUMERIC(8,2)ENCODE raw
,commission NUMERIC(8,2)ENCODE raw
,saletime TIMESTAMPWITHOUTTIMEZONEENCODE raw
);copy sales_compression_on from's3://mybucketredshiftsantiago/tickitdb/sales_tab.txt'credentials 'aws_iam_role=arn:aws:iam::XXXX:role/MiRoleRedshift'delimiter '\t' timeformat 'MM/DD/YYYY HH:MI:SS'COMPUPDATEON region 'us-east-2';copy sales_compression_off from's3://mybucketredshiftsantiago/tickitdb/sales_tab.txt'credentials 'aws_iam_role=arn:aws:iam::XXXX:role/MiRoleRedshift'delimiter '\t' timeformat 'MM/DD/YYYY HH:MI:SS'COMPUPDATEOFF region 'us-east-2';SELECT*FROM pg_catalog.pg_table_defWHERE tablename ='sales_compression_off';SELECT*FROM pg_catalog.pg_table_defWHERE tablename ='sales_compression_on';
Gran clase!!!
Con COPY también puedes especificar a que columnas de tu tabla quieres que se carguen los registro, es muy útil en el día a día.
Herramienta muy poderosa..
que sucede en el caso de tener columnas que tienen diferente longitud ? Por ejemplo que hayan 10000 filas y no pueda saber cual es la medida correcta de la columna?
automaticamente hace lo mejor que puede, no solo por longitud sino por tipo de dato, valores unicos, distancia entre los valores y demas