Carga de CSV a Redshift con COPY

Resumen

Cargar datos a Redshift desde S3 es el paso final de un proceso ETL en Python, donde los DataFrames ya transformados con pandas se exportan a CSV, se suben a un bucket de Amazon S3 con boto3 y luego se ingestan a Redshift mediante el comando COPY. Este flujo es ideal para analistas e ingenieros de datos que buscan automatizar la ingesta hacia un data warehouse.

¿Cómo exportar DataFrames de pandas a CSV antes de cargarlos?

Antes de mover nada a la nube, necesitas dejar tus datos limpios en un formato que Redshift pueda leer sin problemas. Aquí entra el método to_csv de pandas.

La idea es guardar cada DataFrame transformado en una carpeta local llamada target. Para evitar choques con comas dentro de los datos, usamos el carácter pipe (|) como separador, que es mucho menos común en textos.

python df_trades_clean_final.to_csv('target/trades.csv', index=False, sep='|') df_countries.to_csv('target/countries.csv', index=False, sep='|') df_code.to_csv('target/codes.csv', index=False, sep='|') df_quantity.to_csv('target/quantity.csv', index=False, sep='|') df_flow.to_csv('target/flow.csv', index=False, sep='|') df_year.to_csv('target/years.csv', index=False, sep='|')

El parámetro index=False evita que pandas escriba el índice como una columna extra, algo que ensuciaría las tablas en Redshift [01:05].

¿Por qué usar pipe como separador en CSV? Porque la coma suele aparecer dentro de los textos y rompe la estructura del archivo. El pipe | casi nunca aparece en datos reales, así que es más seguro al cargar a Redshift.

¿Cómo conectar Python a S3 y Redshift de forma segura?

La conexión a AWS se hace con la librería boto3, que actúa como cliente para enviar archivos a S3. Para Redshift se usa redshift_connector, que abre una conexión directa al data warehouse.

Lo importante aquí es no escribir credenciales en el código. En su lugar, se leen desde variables de entorno con os.environ.get, lo que protege llaves y contraseñas.

python import boto3, os, redshift_connector

client = boto3.client( 's3', aws_access_key_id=os.environ.get('AWS_ACCESS_KEY_ID'), aws_secret_access_key=os.environ.get('AWS_SECRET_ACCESS_KEY') )

conexion = redshift_connector.connect( host=os.environ.get('REDSHIFT_HOST'), database=os.environ.get('REDSHIFT_DATABASE'), port=5439, user=os.environ.get('REDSHIFT_USER'), password=os.environ.get('REDSHIFT_PASS') ) cursor = conexion.cursor()

El puerto 5439 es el estándar de Redshift, así que ese sí puede ir directo en el código [03:45]. Y un detalle clave: un typo en el nombre de una variable de entorno tumba toda la conexión, así que vale la pena revisar dos veces.

¿Qué hace el cursor en una conexión a Redshift?

El cursor es el objeto que ejecuta sentencias SQL contra la base de datos. Sin él, la conexión está abierta pero no puedes correr consultas ni cargar datos.

¿Cómo subir archivos a S3 y ejecutar COPY a Redshift?

La forma más eficiente de hacer una ingesta masiva en Redshift es subir primero los CSV a S3 y luego ejecutar el comando COPY, que lee el archivo desde el bucket y lo inserta en la tabla destino.

La función cargar_archivo toma el nombre del archivo, deriva el nombre de la tabla, lo sube a S3 y dispara el COPY.

python def cargar_archivo(file_name): table_name = file_name.split('.')[0] client.upload_file( f'target/{file_name}', 'platzi-etl', f'course-etl/target/{file_name}' ) sentencia = f""" COPY etlt.{table_name} FROM 's3://platzi-etl/course-etl/target/{file_name}' CREDENTIALS 'aws_access_key_id={os.environ.get("AWS_ACCESS_KEY_ID")};aws_secret_access_key={os.environ.get("AWS_SECRET_ACCESS_KEY")}' CSV DELIMITER '|' REGION 'us-west-2' IGNOREHEADER 1; """ try: cursor.execute(sentencia) print(f'OK en la tabla {table_name}') except: print(f'Error en la tabla {table_name}')

Fíjate en algunos parámetros del COPY:

  • DELIMITER '|': coincide con el separador que usaste al exportar el CSV.
  • REGION 'us-west-2': la región donde vive el bucket de S3.
  • IGNOREHEADER 1: salta la primera fila del archivo, que contiene los nombres de columna.
  • CREDENTIALS: autentica la operación entre Redshift y S3.

El bloque try/except maneja errores por tabla, así si una falla las demás siguen su curso.

¿Qué hace el comando COPY en Redshift? Es la forma más rápida de cargar datos masivos. Lee archivos directamente desde S3 y los inserta en una tabla, en paralelo, sin pasar por el cliente local.

¿Por qué usar variables de entorno para credenciales AWS?

Guardar el AWS_ACCESS_KEY_ID, el AWS_SECRET_ACCESS_KEY, el host de Redshift o el password en variables de entorno mantiene la información sensible fuera del código fuente.

En tu script solo aparece de dónde se obtiene el dato, no el dato en sí. Esto evita que credenciales se filtren a repositorios públicos y facilita rotar llaves sin tocar el código [05:30].

Con los CSV exportados, el cliente de boto3 listo, la conexión a Redshift activa y la función cargar_archivo definida, ya tienes todo el andamiaje para mover datos desde local hacia el data warehouse. ¿Has automatizado un proceso ETL parecido? Cuéntame en los comentarios qué retos encontraste con las credenciales o el comando COPY.