Pular para o conteúdo

Antes de passar às capacidades avançadas do Data Mapper, ajuda rever brevemente a funcionalidade básica.

O Data Mapper serve para mapear colunas dos dados de origem para a tabela de dados de destino.

Utilizar o botão de menu Inspecionar origem oferece formas adicionais de mapear colunas da origem para o destino:

  • Preencher ambas as tabelas de mapeamento: propaga todos os valores da tabela de dados de origem para a tabela de dados de destino. É o comportamento predefinido.
  • Preencher apenas a tabela de mapeamento de origem: mapeia apenas todos os valores da tabela de dados de origem. É útil ao modificar um fluxo de trabalho existente cuja estrutura de colunas de origem tenha mudado.
  • Preencher apenas a tabela de mapeamento de destino: propaga todos os valores apenas para a tabela de dados de destino.

Se as opções de colunas de origem e de destino não forem suficientes, é possível adicionar outras colunas à tabela de dados de destino de várias formas:

  • Propagar tudo insere todas as colunas de origem na tabela de dados de destino, quer já existissem ou não.
  • Propagar selecionadas insere apenas a(s) coluna(s) de origem selecionada(s).
  • Clique com o botão direito do rato no lado do destino e selecione Inserir linha para inserir uma linha imediatamente acima da linha atualmente selecionada.
  • Clique com o botão direito do rato no lado do destino e selecione Acrescentar linha para inserir uma linha no fim (extrema direita) da tabela de dados de destino.

Para eliminar colunas da tabela de dados de destino, selecione a(s) coluna(s) pretendida(s), clique com o botão direito do rato e selecione Eliminar.

Para reorganizar as colunas da tabela de dados de destino, selecione a(s) coluna(s) pretendida(s). Pode utilizar qualquer uma das opções:

  • Setas de movimentação em massa: escolha a opção de movimentação pretendida nas setas no canto superior direito
  • Menu de contexto: clique com o botão direito do rato e selecione Mover para o início, Mover para cima, Mover para baixo ou Mover para o fim.

Para devolver apenas opções distintas, selecione a opção de menu Distinto. Isto mostra um conjunto de caixas de seleção para cada coluna da origem. Basta assinalar a caixa junto da coluna correspondente para devolver apenas resultados distintos.

Para agregar resultados, selecione a opção de menu Resumir. Isto mostra um conjunto de caixas de seleção para cada coluna da tabela de dados de destino. Escolha um método de resumo adequado para cada coluna.

colunas de origemcust_idamtdtnotecolunas de destinocustomer_idamountorder_datemudar nomeconverter → decimalmudar nomenão mapeada → descartada
O mapeador liga cada coluna de origem a uma coluna de destino — mudando o nome e convertendo tipos pelo caminho. As colunas de origem não mapeadas ficam fora do resultado.

Para agregar resultados, selecione a opção de menu Resumir. Isto mostra um conjunto de caixas de seleção para cada coluna da tabela de dados de destino. Estão disponíveis as seguintes opções de resumo:

Função Descrição
Agrupar por Agrupa os resultados pelo valor
Contagem Número de observações não nulas no grupo
Contagem (incluindo nulos) Número de observações no grupo
Soma Soma dos valores no grupo
Média Média dos valores no grupo
Mediana Mediana dos valores no grupo
Moda Moda dos valores no grupo
Mínimo Mínimo dos valores no grupo
Máximo Máximo dos valores no grupo
Primeiro Primeiro dos valores no grupo, segundo a ordem de ordenação
Último Último dos valores no grupo, segundo a ordem de ordenação
Desvio padrão Desvio padrão não enviesado no grupo
Desvio padrão da amostra Desvio padrão da amostra no grupo
Desvio padrão da população Desvio padrão da população no grupo
Variância Variância não enviesada no grupo
Variância da amostra Variância da amostra no grupo
Variância da população Variância da população no grupo
Avançado sem agrupamento Seleção especial de agregação ao utilizar funções de janela

Escolha o método de resumo adequado para a coluna.

Chaves de agregação para REST e assistentes de IA

Seção intitulada “Chaves de agregação para REST e assistentes de IA”

Quando define um passo através da API REST ou de um assistente de IA, cada coluna de destino transporta o respetivo resumo em agg, e o aggregation_type do passo seleciona as mesmas opções. Todos os passos com um Data Mapper aceitam estes valores:

Chave Resumo
group Agrupar por
dont_group Avançado sem agrupamento: a coluna não é agrupada nem agregada, para expressões que agregam ou usam janelas por si próprias
count Contagem de observações não nulas no grupo
count_null Contagem incluindo nulos
count_distinct Contagem de valores distintos no grupo
sum Soma
avg Média
median Mediana
min Mínimo
max Máximo
stddev Desvio padrão
stddev_samp Desvio padrão da amostra
stddev_pop Desvio padrão da população
variance Variância
var_samp Variância da amostra

Cada coluna de destino pode ter um sort: asc, desc ou none, ou um objeto {ascending, order}. ascending é true ou false. order é um número inteiro que define a prioridade da chave: as colunas com order são ordenadas primeiro, começando pelo número mais baixo, e as restantes colunas ordenadas seguem-se pela posição da coluna.

Ao utilizar uma função de janela, selecione Avançado sem agrupamento como método de agregação. Esta seleção especial é necessária porque a função de janela já inclui agregação.

Especificar um valor na coluna Constante substitui o valor da coluna de origem, se especificada, e preenche a coluna com o valor constante indicado.

Uma coluna de destino obtém o seu valor daquilo que preencher, por esta ordem: uma Constante tem prioridade, depois uma Expressão e, por fim, a coluna de Origem.

Assim, uma coluna que calcula o seu valor não precisa de Origem. Deixe-a em branco numa constante ou numa expressão — a constante ou a expressão já define qual é o valor, e uma Origem junto de uma delas é ignorada. Preencha a Origem quando estiver a mapear uma coluna diretamente dos dados de entrada, a mudar-lhe o nome ou a convertê-la pelo caminho.

Uma expressão lê as colunas de entrada pelo nome, com get_column(table, 'Column Name'), e não através da célula Origem.

O Data Mapper oferece uma conveniente capacidade de limpeza por apontar e clicar para aplicar conversões aos dados de uma coluna.

As operações de limpeza incluem as seguintes categorias:

  • Remoção de espaços do texto
  • Formatação de texto
  • Transformações de texto
  • Conversão de e para valores NULL
  • Formatação de números
  • Análise de datas

O resultado das seleções de limpeza é convertido numa expressão consolidada, que pode ser visualizada na informação da expressão.

As expressões no Data Mapper são um dos conceitos mais poderosos e flexíveis do PlaidCloud. Oferecem uma flexibilidade quase ilimitada, mantendo um desempenho excecional, mesmo com dados extremamente grandes.

As expressões são escritas com a sintaxe do Python SQLAlchemy, juntamente com algumas funções auxiliares adicionais disponíveis no PlaidCloud. Isto permite ao PlaidCloud expor diretamente o conjunto completo de capacidades do armazém de dados subjacente (por exemplo, Greenplum, SAP HANA, Redshift, etc.). Além disso, existem muitos recursos publicamente disponíveis que oferecem referências rápidas para a utilização de operações SQLAlchemy. Ao usar a sintaxe SQLAlchemy padrão, o PlaidCloud evita a armadilha comum de criar mais uma sintaxe específica de domínio.

O editor de expressões abre-se com um duplo clique na célula da expressão da coluna. Depois de aberto, a lista de colunas é apresentada à esquerda, enquanto uma extensa biblioteca de funções é apresentada à direita.

Embora seja perfeitamente possível escrever a expressão diretamente no editor, normalmente é mais fácil começar com a seleção de funções e colunas por apontar e clicar. A biblioteca de funções inclui os seguintes grupos:

  • Condições
  • Condições específicas de coluna
  • Conversões
  • Datas
  • Matemática
  • Texto
  • Resumos
  • Operações de funções de janela
  • Matrizes
  • JSON
  • PostGIS (geoespacial)
  • Trigonometria

Depois de concluir a expressão, guarde-a para que seja aplicada à coluna.

Consulte exemplos e funções de expressão na área Expressões.

cast(x, Float) devolve um número de precisão dupla de 64 bits em todos os armazéns, pelo que um valor como 1225541207.71 mantém todos os dígitos. No StarRocks, a conversão para Float passa a ser aplicada, onde antes era ignorada, e no Databend é de precisão dupla em vez de precisão simples. Uma coluna Float que o PlaidCloud cria a partir de dados de vírgula flutuante também é de precisão dupla. Uma tabela que já tenha uma coluna de precisão simples passa a precisão dupla da próxima vez que um passo a reconstruir com Overwrite.

No StarRocks:

  • Uma conversão para inteiro grande suporta valores acima de cerca de 2,1 mil milhões.
  • Uma conversão para Numeric sem precisão mantém as casas decimais, até 10, em vez de arredondar para um número inteiro.
  • Uma conversão para JSON é aplicada.

Em todos os armazéns, um valor que não possa ser convertido, como texto não numérico convertido para número, passa a nulo em vez de interromper o passo.

sqlalchemy.literal_column passa um fragmento de SQL para o armazém sem o alterar, e aceita um único valor — uma coluna, um cálculo, um CASE, uma chamada de função, uma conversão, uma função de janela. Um literal_column que contenha uma subconsulta ((SELECT ... FROM ...)) é recusado, porque uma subconsulta acede a uma tabela que o passo nunca declarou.

As regras desta secção aplicam-se onde quer que a expressão seja escrita — aqui no mapeador, no filtro de um passo e numa consulta montada noutro local e enviada para a plataforma. São verificadas quando o passo é guardado e novamente quando a expressão é convertida em SQL.

Construa antes a subconsulta com sqlalchemy.select(...) — .scalar_subquery() quando precisar de um único valor numa coluna, ou .subquery() quando selecionar a partir dela:

# Refused
sqlalchemy.literal_column('(SELECT rate FROM fx WHERE fx.cc = t.cc)')
# Supported — a single value in a column
sqlalchemy.select(fx.c.rate).where(fx.c.cc == t.c.cc).scalar_subquery()
# Supported — a table to select from
sqlalchemy.select(fx.c.rate).subquery()

Colocar entre parênteses um OR de nível superior

Seção intitulada “Colocar entre parênteses um OR de nível superior”

Um literal_column cujo operador mais externo seja OR também é recusado. O PlaidCloud passa o texto sem o alterar, pelo que uma condição acrescentada a seguir ficaria associada a apenas metade dele — a OR b seguido de AND region = 'East' lê-se como a OR (b AND region = 'East'), e as linhas que pretendia excluir voltam a aparecer.

Acrescente parênteses e funciona como antes:

# Refused
sqlalchemy.literal_column("status = 'open' OR status = 'pending'")
# Supported
sqlalchemy.literal_column("(status = 'open' OR status = 'pending')")

Uma disjunção em qualquer ponto dentro da expressão — num CASE, ou já entre parênteses — não é afetada.

XOR é recusado onde quer que apareça, com ou sem parênteses: os armazéns divergem quanto à precedência deste operador, pelo que não existe uma leitura que seja segura em todos. Escreva-o por extenso, como (a AND NOT b) OR (NOT a AND b).

Um literal_column que contenha um comentário é recusado pelo mesmo motivo: um comentário estende-se até ao fim da instrução, pelo que apaga o que o PlaidCloud acrescenta a seguir à sua expressão, e não apenas o que escreveu.

-- é recusado quando chegaria ao resto da instrução. # é recusado em qualquer parte do texto, sem exceção — incluindo dentro de uma cadeia entre aspas e incluindo os operadores de caminho JSON #> e #>> do Postgres:

# Refused
sqlalchemy.literal_column("attrs #> '{a,b}'")
sqlalchemy.literal_column("code || '#'")

# abre um comentário em armazéns compatíveis com MySQL, como o StarRocks, e o PlaidCloud não sabe qual o armazém que executará a expressão no momento em que a escreve — pelo que não existe nenhuma posição no texto em que seja seguro de forma fiável, e um # que parece estar entre aspas para um motor é o início de um comentário para outro. Se precisar do caráter como dados, passe-o como valor:

# Supported
sqlalchemy.func.concat(table.code, sqlalchemy.literal('#'))

As mesmas duas grafias são recusadas em .op('...').

Tudo o resto para que literal_column é normalmente usado não é afetado — literal_column('current_date'), literal_column("CASE WHEN amount > 0 THEN 'p' ELSE 'n' END") e func.count() funcionam todos como antes. Os nomes de coluna com espaços, pontos ou aspas também não são afetados; o armazém aplica-lhes as aspas por si.