DataSkills Hub

Apache Hive Metastore

Apache Hive Metastore es un catálogo central de metadatos para almacenamiento distribuido. Gestiona la definición de tablas, esquemas y particiones para datos almacenados en Ceph/S3. Trino (catálogo hive), Spark y otros procesadores consultan HMS para descubrir y acceder a las tablas del Data Lake.

#Getting Started

#Acceder a Hive Metastore

Conectarse vía Trino al catálogo Hive

# Configurar conexión a Trino (catálogo Hive integrado)
$ trino --server <tu-url> \
        --user <tu_usuario> \
        --catalog hive

Verificar conexión a HMS

-- Ver todos los esquemas en el catálogo Hive
SHOW SCHEMAS FROM hive;

-- Ver tablas en un schema específico
SHOW TABLES FROM hive.default;

-- Consultar metadatos de una tabla
DESCRIBE hive.default.clientes;
DESCRIBE FORMATTED hive.default.clientes;

#Conexión desde Spark

from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .appName("HiveApp") \
    .config("spark.sql.warehouse.dir", "s3a://data-analytics/warehouse/") \
    .config("hive.metastore.uris", "<metastore-url>") \
    .enableHiveSupport() \
    .getOrCreate()

# Consultar tabla registrada en HMS
df = spark.sql("SELECT * FROM hive.default.clientes LIMIT 10")

#Crear Tablas

#Tabla gestionada (managed)

-- Tabla gestionada: HMS controla datos y metadatos
CREATE TABLE hive.default.clientes_temp (
    customer_id BIGINT,
    nombre VARCHAR,
    email VARCHAR,
    fecha_creacion DATE
)
STORED AS PARQUET;

#Tabla externa (external)

-- Tabla externa: metadatos en HMS, datos en Ceph
CREATE EXTERNAL TABLE hive.default.ventas_raw (
    sale_id BIGINT,
    customer_id BIGINT,
    monto DECIMAL(10, 2),
    fecha DATE
)
STORED AS PARQUET
LOCATION 's3a://data-raw/ventas/';

#Tabla particionada

-- Tabla particionada por fecha
CREATE EXTERNAL TABLE hive.default.transacciones (
    transaction_id BIGINT,
    customer_id BIGINT,
    monto DECIMAL(10, 2)
)
PARTITIONED BY (
    year INT,
    month INT,
    day INT
)
STORED AS PARQUET
LOCATION 's3a://data-analytics/transacciones/';

#Operaciones de Esquema

#Listar particiones

-- Ver particiones de una tabla
SHOW PARTITIONS hive.default.transacciones;

-- Ver particiones específicas
SHOW PARTITIONS hive.default.transacciones
WHERE year=2026 AND month=3;

#Agregar particiones

-- Agregar partición manualmente
ALTER TABLE hive.default.transacciones
ADD PARTITION (year=2026, month=3, day=14)
LOCATION 's3a://data-analytics/transacciones/2026/03/14/';

-- Agregar múltiples particiones
ALTER TABLE hive.default.transacciones
ADD IF NOT EXISTS
    PARTITION (year=2026, month=3, day=12) LOCATION '...'
    PARTITION (year=2026, month=3, day=13) LOCATION '...';

#Reparar tabla (msck repair)

-- Sincronizar HMS con archivos en S3
-- Detecta particiones que existen en S3 pero no en HMS
MSCK REPAIR TABLE hive.default.transacciones;

-- Modo check (solo listar, sin agregar)
MSCK REPAIR TABLE hive.default.transacciones CHECK PARTITIONS;

#Agregar y modificar columnas

-- Agregar columna
ALTER TABLE hive.default.clientes
ADD COLUMNS (segmento VARCHAR, fecha_actualizacion TIMESTAMP);

-- Cambiar tipo de columna (solo para tipos compatibles)
ALTER TABLE hive.default.clientes
CHANGE COLUMN email email_principal VARCHAR;

-- Renombrar tabla
ALTER TABLE hive.default.clientes
RENAME TO hive.default.clientes_activos;

#Propiedades y Configuración

#Ver propiedades de tabla

-- Ver propiedades personalizadas de tabla
SHOW TBLPROPERTIES hive.default.clientes;

-- Ver propiedades de partición
SHOW PARTITIONS hive.default.transacciones;
SHOW PARTITIONPROPERTIES hive.default.transacciones PARTITION(year=2026, month=3);

#Establecer propiedades

-- Agregar propiedades a tabla (metadata)
ALTER TABLE hive.default.clientes
SET TBLPROPERTIES (
    'owner'='data-engineering',
    'description'='Tabla maestra de clientes',
    'last_modified_by'='spark-job',
    'pii'='true'
);

-- Propiedades de partición
ALTER TABLE hive.default.transacciones
PARTITION (year=2026, month=3, day=14)
SET LOCATION 's3a://data-analytics/transacciones/2026/03/14/';

#Consultas de Metadata

#Información de tablas

-- Listar todas las tablas de un schema
SELECT * FROM information_schema.tables
WHERE table_schema = 'default';

-- Columnas de una tabla
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_schema = 'default' AND table_name = 'clientes';

-- Tamaño estimado de tabla
SELECT
    table_name,
    size_in_bytes,
    num_files
FROM information_schema.table_stats
WHERE table_schema = 'default';

#Estadísticas de tablas (ANALYZE)

-- Calcular estadísticas (tamaño, filas, distribución)
ANALYZE TABLE hive.default.clientes COMPUTE STATISTICS;

-- Estadísticas por columna (para query optimization)
ANALYZE TABLE hive.default.transacciones
COMPUTE STATISTICS FOR COLUMNS customer_id, monto;

-- Ver estadísticas guardadas
SHOW STATS FOR TABLE hive.default.clientes;

#Integración con el Stack

#Registrar tabla desde datos Ceph (Spark)

# Crear tabla externa desde archivos Ceph
spark.sql("""
    CREATE EXTERNAL TABLE IF NOT EXISTS hive.default.ventas_s3 (
        sale_id BIGINT,
        customer_id BIGINT,
        monto DOUBLE,
        fecha DATE
    )
    STORED AS PARQUET
    LOCATION 's3a://data-raw/ventas/2026/'
""")

# Reparar particiones después de cargar datos
spark.sql("MSCK REPAIR TABLE hive.default.ventas_s3")

#Consulta Trino (multi-catalog)

-- Consultar tabla Hive + tabla Iceberg
SELECT
    h.sale_id,
    h.monto,
    i.customer_segment
FROM hive.default.ventas h
LEFT JOIN iceberg.analytics.clientes i
    ON h.customer_id = i.customer_id;

#Sincronizar particiones después de ingesta

# Después de cargar datos en Ceph
# Reparar tabla para que HMS detecte nuevas particiones
spark.sql("MSCK REPAIR TABLE hive.default.transacciones ADD PARTITIONS")

# O agregar manualmente si se conocen las particiones
spark.sql("""
    ALTER TABLE hive.default.transacciones
    ADD PARTITION (year=2026, month=3, day=14)
    LOCATION 's3a://data-raw/transacciones/2026/03/14/'
""")

#Mejores Prácticas

Práctica Descripción
Schemas Usar hive.raw, hive.staging, hive.analytics según capa. Nunca usar default.
Tablas externas Preferir externas para datos en Ceph/S3. Managed solo para datos intermedios.
Particionamiento Particionar por year/month/day. Máximo 10K particiones por tabla.
Nombres Convención: <area>_<entidad>_<tipo>, ej. comercial_clientes_raw, telco_cdr_staging.
MSCK REPAIR Ejecutar después de cargar datos en S3 para sincronizar particiones con HMS.
Propiedades Siempre establecer owner, description, pii en tablas sensibles.
Estadísticas Ejecutar ANALYZE en tablas críticas (antes de joins grandes).
Limpieza Eliminar particiones obsoletas regularmente: ALTER TABLE ... DROP PARTITION.

#Troubleshooting

Problema Causa Solución
Partición no aparece en HMS Datos en S3 pero no registrados MSCK REPAIR TABLE
Error "Table not found" Tabla en schema incorrecto Verificar schema: SHOW TABLES FROM schema_name
Slow queries Estadísticas desactualizadas ANALYZE TABLE ... COMPUTE STATISTICS
Partición duplicada Agregar sin IF NOT EXISTS Usar DROP PARTITION antes de agregar
HMS no responde Conexión thrift fallida Verificar <tu-url>

#Also see