Ir para o conteúdo

Particionamento Hive-style

O Dataforge suporta particionamento de saída no formato Hive: os arquivos são organizados em subpastas nomeadas coluna=valor.

Como usar

Use a flag --partition-by. Ela aceita dois formatos:

Formato Efeito
--partition-by coluna Aplica a partição a todas as tabelas
--partition-by tabela:coluna Aplica a partição apenas à tabela especificada

A flag é repetível para definir regras diferentes por tabela.

Exemplos

# Particionar todas as tabelas pela coluna "created_at"
docker compose run --rm cli generate -d ecommerce -f parquet \
  --partition-by created_at

# Particionar apenas a tabela "orders" pela coluna "status"
docker compose run --rm cli generate -d ecommerce -f parquet \
  --partition-by "orders:status"

# Múltiplas regras
docker compose run --rm cli generate -d ecommerce -f parquet \
  --partition-by "orders:status" \
  --partition-by "order_items:order_id"

Layout de saída

Com --partition-by "orders:status":

output/
└── ecommerce/
    └── orders/
        ├── status=cancelled/
        │   └── orders.parquet
        ├── status=delivered/
        │   └── orders.parquet
        ├── status=pending/
        │   └── orders.parquet
        ├── status=processing/
        │   └── orders.parquet
        └── status=shipped/
            └── orders.parquet

Comportamento por formato

Formato Sem recorrência Com recorrência
CSV Um arquivo por partição (tabela.csv) Append no mesmo arquivo
JSON flat Um arquivo por partição (tabela.json) Append no mesmo arquivo
Parquet Um arquivo por partição (tabela.parquet) Arquivo com timestamp por batch
Avro Um arquivo por partição (tabela.avro) Arquivo com timestamp por batch

Valores seguros em nomes de pasta

Caracteres problemáticos nos valores da coluna de partição são sanitizados:

  • /-
  • Espaços → _

Por exemplo, o valor "New York" gera a pasta city=New_York.

Compatibilidade com ferramentas analíticas

O layout Hive-style é reconhecido diretamente por:

  • Apache Sparkspark.read.parquet("output/ecommerce/orders/")
  • AWS Athena / Glue — descoberta automática de partições
  • DuckDBread_parquet("output/ecommerce/orders/**/*.parquet", hive_partitioning=true)
  • dbt — uso como source com partições

Granularidade de data nas partições

Quando a coluna de partição contém datas, os valores brutos como 2024-03-15 geram muitas subpastas. Use --partition-date-granularity para truncar esses valores:

Granularidade Formato gerado Exemplo de pasta
year YYYY created_at=2024
month YYYY-MM created_at=2024-03
# Particionar orders por mês
docker compose run --rm cli generate -d ecommerce -f parquet \
  --partition-by "orders:created_at" \
  --partition-date-granularity "orders:month"

# Aplicar granularidade anual a todas as tabelas
docker compose run --rm cli generate -d ecommerce -f parquet \
  --partition-by created_at \
  --partition-date-granularity year

Layout de saída com --partition-date-granularity month:

output/
└── ecommerce/
    └── orders/
        ├── created_at=2023-01/
        │   └── orders.parquet
        ├── created_at=2023-02/
        │   └── orders.parquet
        └── created_at=2024-12/
            └── orders.parquet

Paralelismo na escrita

Por padrão, a escrita de partições usa até 16 threads em paralelo. Ajuste com --workers:

docker compose run --rm cli generate -d ecommerce -f parquet \
  --partition-by "orders:status" \
  --workers 4

Colunas de data

Particionar por uma coluna de data (created_at, transaction_date) é o padrão mais comum para datasets temporais. Combine com o modo recorrente e --increment para simular pipelines incrementais.