El formato Apache Parquet es un formato de almacenamiento en columnas altamente eficiente y optimizado para grandes volúmenes de datos. Una de sus características clave es el Data Compression, que reduce significativamente el tamaño de los datos almacenados, mejorando el rendimiento en lectura y escritura.
La compresión en Parquet permite reducir el tamaño de los datos en disco al aplicar algoritmos de compresión a los bloques y páginas del archivo. Debido a que Parquet almacena datos en un formato columnar, la compresión es más efectiva porque las columnas tienden a contener valores similares, lo que mejora la eficiencia de los algoritmos.
1. Ahorro de espacio en disco: Reduce el tamaño de los archivos almacenados.
2. Mejora del rendimiento: Al reducir la cantidad de datos transferidos desde el disco, mejora la velocidad de lectura.
3. Eficiencia en consultas: Parquet permite descomprimir solo las columnas necesarias para una consulta.
Parquet soporta varios algoritmos de compresión. Aquí una comparación:
| Algoritmo | Descripción | Compresión | Velocidad de compresión | Velocidad de descompresión |
|---|---|---|---|---|
| SNAPPY | Rápido y eficiente, ideal para análisis. | Moderada | Alta | Alta |
| GZIP | Alta tasa de compresión. | Alta | Baja | Moderada |
| LZO | Similar a SNAPPY, pero menos popular. | Moderada | Alta | Alta |
| ZSTD | Alta compresión y velocidad equilibrada. | Alta | Alta | Alta |
| NONE | Sin compresión. | N/A | N/A | N/A |
La configuración de la compresión depende de la herramienta o framework que utilices para crear o leer archivos Parquet.
PySpark permite especificar el algoritmo de compresión al guardar archivos Parquet:
from pyspark.sql import SparkSession
# Crear una sesión de Spark
spark = SparkSession.builder.appName("Parquet Compression Example").getOrCreate()
# Crear un DataFrame de ejemplo
data = [("Alice", 34), ("Bob", 45), ("Charlie", 29)]
df = spark.createDataFrame(data, ["Name", "Age"])
# Guardar el DataFrame en formato Parquet con compresión SNAPPY
df.write.parquet("output_snappy", compression="snappy")
# Guardar con compresión GZIP
df.write.parquet("output_gzip", compression="gzip")
En pandas, puedes exportar datos al formato Parquet con compresión especificada:
import pandas as pd
# Crear un DataFrame de ejemplo
data = {"Name": ["Alice", "Bob", "Charlie"], "Age": [34, 45, 29]}
df = pd.DataFrame(data)
# Guardar en Parquet con compresión GZIP
df.to_parquet("output.parquet", compression="gzip")
En Apache Hive, puedes configurar la compresión al escribir tablas Parquet:
SET hive.exec.compress.output=true;
SET parquet.compression=SNAPPY;
CREATE TABLE ejemplo_parquet (id INT, nombre STRING)
STORED AS PARQUET;
INSERT OVERWRITE TABLE ejemplo_parquet SELECT * FROM otra_tabla;
Apache Drill permite definir el algoritmo de compresión al escribir datos en Parquet:
ALTER SESSION SET `store.parquet.compression` = 'snappy';
CREATE TABLE dfs.tmp.ejemplo_parquet AS
SELECT * FROM `dfs.tmp.otra_tabla`;
Supongamos un dataset con 1 millón de filas. Aquí un ejemplo de los tamaños obtenidos con distintos algoritmos:
| Algoritmo | Tamaño del archivo | Tiempo de escritura | Tiempo de lectura |
|---|---|---|---|
| SNAPPY | 100 MB | 2 segundos | 1.5 segundos |
| GZIP | 50 MB | 4 segundos | 2 segundos |
| ZSTD | 60 MB | 3 segundos | 1.5 segundos |
| NONE | 200 MB | 1 segundo | 1 segundo |
Para inspeccionar la compresión utilizada en un archivo Parquet, puedes usar herramientas como parquet-tools:
1. Instalar parquet-tools:
brew install parquet-tools # Para macOS
2. Inspeccionar el archivo:
parquet-tools meta output.parquet
En la salida, busca la propiedad compression.
La compresión en Parquet es una característica clave para trabajar con grandes volúmenes de datos. Elegir el algoritmo correcto depende del caso de uso y de las prioridades de rendimiento y almacenamiento. Al configurarla adecuadamente, puedes optimizar tanto el costo como la eficiencia de tu sistema de datos.
Jorge García
Fullstack developer