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