APACHE HIVE

Objetivo

Documentar como subir uma instância de Apache Hive utilizando metastore Postgresql e tabelas Iceberg.

Por default, o Hive utiliza o Apache Derby como armazenador de metadados.
Para utilizar o Iceberg, é obrigatorio que a versão do Hive seja 4.0.0 ou superior. Para versões menores algumas operações podem não funcionar.

Dependencias

[1] Docker - Version >= 27.1.1

Instalação por docker

Para utilizar o apache hive com docker primeiro exporte para a variável HIVE_VERSION a versão a ser utilizada.
Em seguida faça o download do driver do postgres e exporte para a variável POSTGRES_LOCAL_PATH o caminho absoluto do arquivo.
Este driver será utilizado para a conexão entre postgres e os serviços.

# Hive version
export HIVE_VERSION=4.0.0

# Postgres Driver
wget https://jdbc.postgresql.org/download/postgresql-42.7.3.jar
export POSTGRES_LOCAL_PATH=/home/user/Downloads/postgresql-42.7.3.jar

# Docker compose
docker compose up -d

# Connect to hive
docker exec -it hiveserver2 beeline -u 'jdbc:hive2://hiveserver2:10000/'

# In case of connection problems:
docker exec -it hiveserver2 /bin/bash
hive
!connect jdbc:hive2://localhost:10000
username: hive     (Defined in docker-compose.yml)
password: password (Defined in docker-compose.yml)

# Check if hive is working
show databases 

Observações Importantes

[1] Ao criar tabelas no apache hive, os nomes dos tipos devem seguir o hive ao invés dos tipos mostrados na documentação do Iceberg. Um exemplo disso é o tipo long não ser aceito.
[2] Ao criar tabelas particionadas, a coluna da partição deve ser declarada após PARTITION BY, deve também declarar seu tipo e NÃO PODE CONTER CONSTRAINTS. Do contrário haverá conflito de duas colunas repetidas.
Exemplo de erro:

-- Modo errado
CREATE TABLE usuarios (
    Usuario_id INTEGER NOT NULL,
    Nome STRING NOT NULL,
    Departamento_id INTEGER
) 
 PARTITIONED BY (Departamento_id NOT NULL)
 STORED BY ICEBERG;

-- Modo correto
CREATE TABLE usuarios (
    Usuario_id INTEGER NOT NULL,
    Nome STRING NOT NULL
) 
 PARTITIONED BY (Departamento_id INTEGER)
 STORED BY ICEBERG;

Importar Dados

Tabelas Iceberg apenas aceitam três tipos a serem importados, PARQUET, AVRO e ORC. Sendo utilizado o tipo PARQUET por default.

-- You can specify the default file format (Avro, Parquet, ORC) at the time of the table creation. The default is Parquet:
CREATE TABLE x (i int) STORED BY ICEBERG STORED AS ORC;

Problemas/Dificuldades

[1]: Por algum motivo desconhecido, o docker de metadados fica reiniciando impossibilitando a conexão com o hive. O jeito é ficar tentando.