Skip to content

Table

Uma tabela é o destino de um flow no Data Warehouse. Ela vive em tables/<slug>--<id>.yaml.

Quem manda no esquema físico (nomes de coluna, tipos) é o flow que alimenta a tabela. O YAML da tabela controla o modelo de chaves do Doris e a camada cosmética: rótulo, máscara e descrição de cada coluna.

Crie a tabela a partir de um nó do flow, que é o caminho que preenche as colunas para você:

bash
lumo new table --from-flow flow:44531 --node join_itens --name "Fato Vendas"

Ligue o autocomplete no editor colando esta linha no topo do arquivo:

yaml
# yaml-language-server: $schema=https://docs.horusbi.com.br/schemas/v2/table.schema.json

Modelo de configuração

yaml
# ── header ────────────────────────────────────────────────
id: integer                     # obrigatório, >= 1
kind: table                     # obrigatório, literal "table"
lumo: v2                        # obrigatório, literal "v2"
tenantId: integer               # obrigatório, >= 1
---
# ── body ──────────────────────────────────────────────────
nome: string                    # obrigatório, mínimo 1 caractere
table_type: string              # obrigatório: table | file | cloud
key_type: string                # duplicate | unique. ESTRUTURAL. proibido quando table_type=cloud
key_columns: [string]           # colunas que formam a chave. ESTRUTURAL. proibido quando table_type=cloud
partition_column: string | null # coluna de partição. ESTRUTURAL. proibido quando table_type=cloud
icon: string | null
tags: [string]

columns:                        # obrigatório. objeto, chaveado por "NOME_DA_COLUNA (TipoDeDado)"
  NOME_DA_COLUNA (DataType):    # chave somente-leitura: o esquema é do flow
    label: string               # rótulo exibido
    mask: string | null         # máscara de formatação
    human_description: string | null
    defaultBehavior: string

expressions:                    # colunas calculadas
  - column_name: string         # obrigatório
    label: string               # obrigatório
    column_type: string         # obrigatório: column | expression
    data_type: string           # obrigatório: Number | String | Date | Boolean | DateTime | Time | Json
    display_order: integer      # obrigatório, >= 0
    expression: string | null
    is_key_column: boolean
    is_partition_column: boolean
    indexed: boolean
    human_description: string | null
    mask: string | null

key_type, key_columns e partition_column são estruturais. Mudar qualquer um deles força um DROP e CREATE da tabela física no Doris, e as linhas são perdidas. O lumo push recusa a mudança numa tabela que já tem dados, a menos que você passe --force-recreate. Depois disso, rode o flow de novo para recarregar.

Configuração completa

yaml
# tables/fato-vendas--44940.yaml
# yaml-language-server: $schema=https://docs.horusbi.com.br/schemas/v2/table.schema.json
id: 44940
kind: table
lumo: v2
tenantId: 853
---
nome: fato_vendas
table_type: table

# unique deduplica linhas com a mesma key_columns (a última carga vence).
# duplicate acumula linhas a cada carga. Numa carga Temporal que recarrega
# uma janela, duplicate multiplica os registros: use unique.
key_type: unique
key_columns: [PEDIDO_ID, PRODUTO_ID]
partition_column: DATA_EMISSAO

# A chave de cada coluna é "NOME (Tipo)" e é somente-leitura: quem define o
# esquema é o flow. Só os valores abaixo dela são editáveis.
columns:
  PEDIDO_ID (Number):
    label: Pedido
    mask: N0
  PRODUTO_ID (Number):
    label: Produto
    mask: N0
  CLIENTE_ID (Number):
    label: Cliente
    mask: N0
  DATA_EMISSAO (Date):
    label: Data de Emissão
    mask: DATE
  QUANTIDADE (Number):
    label: Quantidade
    mask: N2
  VALOR_ITEM (Number):
    label: Valor do Item
    mask: C2
    human_description: Valor líquido do item, já com desconto aplicado.

expressions:
  - column_name: TICKET_MEDIO
    label: Ticket Médio
    column_type: expression
    data_type: Number
    display_order: 6
    expression: VALOR_ITEM / NULLIF(QUANTIDADE, 0)
    mask: C2
    human_description: Valor médio por unidade vendida.

tags: [vendas]

Especificação: header

id

Tipo: integer (>= 1) · Obrigatório: sim

Id da tabela no servidor.

kind

Tipo: string · Obrigatório: sim · Valor: table

lumo

Tipo: string · Obrigatório: sim · Valor: v2

tenantId

Tipo: integer (>= 1) · Obrigatório: sim

Especificação: body

nome

Tipo: string (mínimo 1 caractere) · Obrigatório: sim

Nome da tabela no DW.

table_type

Tipo: string · Obrigatório: sim · Valores: table, file, cloud

ValorO que éUsável em apps
tableTabela normal do DW, alimentada por um InsertDatawarehouse em modo Datawarehouse.Sim
fileTabela estática, alimentada por upload de Excel pela interface do DW. Não tem flow.Sim
cloudSaída em parquet no datalake, de um InsertDatawarehouse em modo Datalake. Só serve como entrada de ExtractLakehouse em outro flow.Não

Uma tabela cloud não aceita key_type, key_columns nem partition_column: o modelo de chaves é do Doris, e o datalake não tem Doris.

key_type

Tipo: string · Obrigatório: não · Valores: duplicate, unique · Restrição: proibido quando table_type é cloud · Estrutural

Modelo de chaves do Doris.

  • duplicate: cada carga acumula linhas (append).
  • unique: linhas com a mesma key_columns são deduplicadas, e a última escrita vence (upsert).

Não confunda com PrimaryKeys do nó InsertDatawarehouse. Aquele deduplica em memória durante uma carga. Este é o modelo físico da tabela e vale entre cargas.

key_columns

Tipo: array de string · Obrigatório: não · Restrição: proibido quando table_type é cloud · Estrutural

Colunas que formam a chave do Doris. Com key_type: unique, é a chave de deduplicação. Com duplicate, é a chave de ordenação. Cada nome precisa bater com uma coluna física.

partition_column

Tipo: string ou null · Obrigatório: não · Default: null · Restrição: proibido quando table_type é cloud · Estrutural

Coluna usada como partição do Doris. Precisa bater com uma coluna física.

columns

Tipo: object · Obrigatório: sim

Camada cosmética sobre as colunas físicas, chaveada por NOME_DA_COLUNA (TipoDeDado). A chave é somente-leitura, porque o esquema pertence ao flow. Para mudar nome, tipo ou esquema de uma coluna, altere o flow que alimenta a tabela.

Cada valor aceita:

CampoTipoO que faz
labelstringRótulo exibido da coluna.
maskstring ou nullMáscara de formatação, como N0, C2, DATE.
human_descriptionstring ou nullDescrição de negócio da coluna. Alimenta a IA.
defaultBehaviorstringComportamento padrão da coluna.
yaml
columns:
  VALOR_ITEM (Number):
    label: Valor do Item
    mask: C2

expressions

Tipo: array de objetos · Obrigatório: não · Default: []

Colunas calculadas. Cada item exige column_name, label, column_type, data_type e display_order.

icon

Tipo: string ou null · Obrigatório: não

Ícone da tabela na interface.

tags

Tipo: array de string · Obrigatório: não · Default: []

Especificação: expression

Cada item de expressions.

column_name

Tipo: string (mínimo 1 caractere) · Obrigatório: sim

Nome da coluna calculada.

label

Tipo: string · Obrigatório: sim

Rótulo exibido.

column_type

Tipo: string · Obrigatório: sim · Valores: column, expression

Use expression para uma coluna calculada.

data_type

Tipo: string · Obrigatório: sim · Valores: Number, String, Date, Boolean, DateTime, Time, Json

display_order

Tipo: integer (>= 0) · Obrigatório: sim

Posição da coluna na listagem.

expression

Tipo: string ou null · Obrigatório: não

A fórmula. Divisões precisam se proteger de zero, com NULLIF no denominador.

yaml
expression: VALOR_ITEM / NULLIF(QUANTIDADE, 0)

is_key_column

Tipo: boolean · Obrigatório: não · Default: false

is_partition_column

Tipo: boolean · Obrigatório: não · Default: false

indexed

Tipo: boolean · Obrigatório: não · Default: false

human_description

Tipo: string ou null · Obrigatório: não

Descrição de negócio. A IA usa este texto para escolher a coluna certa.

mask

Tipo: string ou null · Obrigatório: não

Máscara de formatação.

Campos gerenciados pelo servidor

CampoO que é
_statedraft, published ou inconsistent.
deskIdDesk em que a tabela foi publicada.
originFlowIdFlow que alimenta a tabela.
versionVersão do recurso.
criado_em, criado_por, publicado_em, publicado_porAuditoria.