# 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 `--help` o `-h`) explica los pasos y las opciones. Este `README.md` es 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](../03.03-sqlestudiantes/README.md), 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 con `python3` (en Windows, `python` o `py`). - **En CloudShell:** comprime ESTA carpeta en un zip, abre CloudShell (región `eu-north-1`), **Actions** > **Upload file**, y: ```bash 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 con `cd ~/g214-materiales/tema3/03.11-csvparquet` y, si algún fichero da `Permission 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`.** ```bash 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.** ```bash python3 csv-a-parquet.py estudiantes.csv # 48 filas ``` **Paso 3. Replicar las filas para ver el efecto a escala.** ```bash 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 `UPDATE` sobre 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](../03.02-adminer/README.md)), después la RDS y el Security Group `BaseDeDatos` ([03.01](../03.01-RDSMariaDB.md)), el visor ([03.08](../03.08-dynamodbvisor/README.md)) y las tablas de DynamoDB ([03.07](../03.07-dynamodbcli/README.md) y [03.10](../03.10-estacionesdynamodb/README.md)). ## Cómo sabes que has terminado - [ ] Has convertido `estudiantes.csv` a 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*.csv` y `*.parquet`. Anterior: [03.10 · Ejercicio adicional C](../03.10-estacionesdynamodb/README.md) · Siguiente: (ninguna, es la última del Tema 3)