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.