Tema 3 · 11 · Ejercicio D (opcional): de CSV a Parquet, filas frente a columnas
Presentación del Tema 3: ejercicio opcional de ampliación, sin diapositiva propia (explica por qué los formatos por columnas, como Parquet, ganan en analítica). Duración: 15 minutos (opcional). Coste: ninguno; esta actividad no usa AWS.
¿Dudas con un script? Todos los scripts de esta carpeta traen su propia ayuda:
python3 csv-a-parquet.py --ayuda(también vale--helpo-h) explica los pasos y las opciones. EsteREADME.mdes el paso a paso de la actividad: tenlo a mano y consúltalo antes de preguntar.
Qué vas a hacer
Vas a convertir un CSV con tus propios datos (los 48 estudiantes de tema3_estudiantes.sql) a Parquet, un formato por columnas, y a comparar tamaños y lecturas para ver por qué los formatos por columnas ganan en analítica y por qué un Parquet no se edita (se reescribe entero). Enseña, con datos tuyos, cuándo conviene un motor por filas (como MariaDB/RDS) y cuándo uno por columnas (como Redshift o Athena sobre Parquet).
estudiantes.csv ──csv-a-parquet.py (pyarrow)──> .parquet ──> comparación de tamaños, lectura de una sola columna
Qué se crea en AWS: nada. Todo ocurre en tu PC o en CloudShell, con ficheros locales.
Qué contiene esta carpeta
| Fichero | Para qué sirve | En qué paso se usa |
|---|---|---|
estudiantes.csv |
Los 48 alumnos de tema3_estudiantes.sql en CSV, con cabecera (id,nombre,apellidos,grupo,num_convocatoria,derecho_a_examen) |
Pasos 2 y 3 |
csv-a-parquet.py |
Convierte un CSV con cabecera a Parquet y compara tamaños (necesita pyarrow; no usa AWS) |
Pasos 2 y 3 |
README.md |
Esta guía | Siempre |
Antes de empezar
- [ ] Python 3 y la librería
pyarrow, en tu PC (pip install pyarrow) o en CloudShell (pip3 install --user pyarrow). - Esta actividad es independiente: no necesita la RDS, Adminer ni DynamoDB. (Los datos son los mismos de 03.03, pero no hace falta haberla hecho.)
Cómo llevar los ficheros a donde toque
Elige UNA de las dos formas:
- En tu PC (más sencillo): abre una terminal dentro de esta carpeta (
03.11-csvparquet) y ejecuta los comandos conpython3(en Windows,pythonopy). - En CloudShell: comprime ESTA carpeta en un zip, abre CloudShell (región
eu-north-1), Actions > Upload file, y:
unzip -o 03.11-csvparquet.zip && cd 03.11-csvparquet && chmod -R u+rwX .
sed -i 's/\r$//' *.py
chmod +x *.py
ls
Si ya subiste
g214-materiales.zip(README principal), no necesitas este zip: entra concd ~/g214-materiales/tema3/03.11-csvparquety, si algún fichero daPermission denied, ejecuta allíchmod -R u+rwX . && chmod +x *.py.
Qué verás: ls muestra README.md, csv-a-parquet.py y estudiantes.csv.
Paso a paso
Paso 1. Instalar pyarrow.
pip install pyarrow # en tu PC
pip3 install --user pyarrow # en CloudShell
Qué verás: Successfully installed pyarrow-.... Si ejecutas el script sin él, dice Falta pyarrow. Instálalo con: pip3 install --user pyarrow (en tu PC: pip install pyarrow).
Paso 2. Convertir los 48 alumnos.
python3 csv-a-parquet.py estudiantes.csv # 48 filas
Paso 3. Replicar las filas para ver el efecto a escala.
python3 csv-a-parquet.py estudiantes.csv 20000 # 960.000 filas (48 x 20.000)
Qué verás (medido con pyarrow 25.0.1, compresión snappy; puede variar un poco con otra versión):
| Filas | CSV | Parquet | Relación |
|---|---|---|---|
| 48 | 1.154 bytes | 2.508 bytes | el Parquet pesa 2,2 veces más |
| 48.000 | 1.523.966 bytes | 293.242 bytes | el CSV pesa 5,2 veces más |
| 960.000 | 31.548.967 bytes | 4.221.653 bytes | el CSV pesa 7,5 veces más |
El script también imprime el esquema, lee solo la columna grupo y muestra cuánto ocupa cada columna dentro del fichero: con 960.000 filas, grupo son 14.767 bytes, el 0,35 % (la columna id es el 97,5 %, porque sus valores no se repiten y no comprimen).
Paso 4. Responde a las preguntas del ejercicio.
- (a) ¿Por qué el Parquet de 48 filas pesa más que el CSV? Con tan pocas filas pesan más el esquema y las estadísticas del pie del fichero que los datos.
- (b) ¿Qué fracción del fichero hay que leer para
SELECT grupo? El 0,35 % con 960.000 filas. - (c) ¿Por qué no harías un
UPDATEsobre un Parquet? Un Parquet no se edita, se reescribe entero. - (d) ¿Qué motor pondrías para un TPV y cuál para el informe trimestral? Por filas, como MariaDB/RDS, para el TPV; por columnas, como Redshift o Athena sobre Parquet, para el informe.
Errores frecuentes
| Síntoma | Causa | Solución |
|---|---|---|
Falta pyarrow. Instálalo con: pip3 install --user pyarrow |
No está instalada la librería | pip install pyarrow (PC) o pip3 install --user pyarrow (CloudShell) |
| El script imprime la ayuda y termina | No pasaste el CSV como argumento (o pasaste -h) |
python3 csv-a-parquet.py estudiantes.csv |
Permission denied al lanzar ./csv-a-parquet.py (CloudShell) |
Sin permiso de ejecución | chmod +x csv-a-parquet.py o python3 csv-a-parquet.py ... |
bad interpreter o $'\r': command not found |
Finales de línea de Windows | sed -i 's/\r$//' *.py y repite |
| Tus tamaños no coinciden exactamente con la tabla | Otra versión de pyarrow |
Es normal; lo importante es la relación |
Limpieza
Los ficheros replica_x*.csv y *.parquet que crea el script son solo de prueba: bórralos al terminar (rm replica_x*.csv *.parquet en Linux/CloudShell/Git Bash; en PowerShell, Remove-Item replica_x*.csv, *.parquet). No hay recursos de AWS que borrar.
Esta es la última actividad del tema. Si no lo has hecho ya, termina la limpieza general: Adminer (03.02), después la RDS y el Security Group BaseDeDatos (03.01), el visor (03.08) y las tablas de DynamoDB (03.07 y 03.10).
Cómo sabes que has terminado
- [ ] Has convertido
estudiantes.csva Parquet con 48 filas y con 960.000 filas, y tus tamaños siguen la relación de la tabla (el Parquet pesa más con 48 filas y bastante menos con 960.000). - [ ] Sabes responder las cuatro preguntas del ejercicio.
- [ ] Has borrado los ficheros
replica_x*.csvy*.parquet.
Anterior: 03.10 · Ejercicio adicional C · Siguiente: (ninguna, es la última del Tema 3)