Pular para o conteúdo principal

Ingerir campos de fórmula do Salesforce de forma incremental

info

Beta

Este recurso está em versão Beta.

Por default, LakeFlow Connect não importa campos de fórmula do Salesforce de forma incremental. Em vez disso, ele captura um instantâneo dos campos de fórmula em cada execução pipeline e, em seguida, os une ao restante da tabela. No entanto, você pode habilitar a ingestão incremental de campos de fórmula, o que geralmente melhora significativamente o desempenho e reduz os custos.

Por que os campos de fórmula são ingeridos de forma diferente

O Salesforce calcula campos de fórmula dinamicamente no momento da leitura, em vez de armazená-los como valores estáticos. Uma fórmula, como aquela que usa TODAY() ou NOW(), pode produzir um resultado diferente a cada leitura, mesmo que nada sobre o registro subjacente tenha sido alterado.

As colunas de cursor do Salesforce (como SystemModstamp ou LastModifiedDate) rastreiam alterações no próprio registro, e não em saídas de fórmula. Quando o resultado de uma fórmula muda, o Salesforce não avança as colunas do cursor. Como a ingestão incremental depende dessas colunas de cursor para detectar linhas alteradas, os campos de fórmula não podem ser ingeridos incrementalmente da mesma forma que os campos comuns: uma saída de fórmula pode mudar sem que nenhuma coluna de cursor avance, então uma leitura incremental padrão a perderia silenciosamente.

Para lidar com isso, o LakeFlow Connect separa os dois tipos de campos e usa uma estratégia de refresh diferente para cada um, conforme descrito na seção a seguir.

Como funciona a ingestão incremental de campos de fórmula

Se você usar a abordagem de snapshot default, o resultado final de um pipeline de ingestão do Salesforce é uma série de tabelas de transmissão (uma por tabela de origem), e os campos de fórmula são re-snapshotados e unidos a cada execução.

Se usar a ingestão incremental de campo de fórmula, o conector divide cada tabela em duas partes:

  • Campos sem fórmula são ingeridos incrementalmente em uma tabela de transmissão intermediária. O conector aplica apenas as linhas que de fato foram alteradas no Salesforce, usando as colunas de cursor para detectar alterações (o comportamento padrão de captura de dados de alterações (CDC) incremental).
  • Os campos de fórmula são recriados como uma view materializada que recalcula a lógica da fórmula sobre a tabela de transmissão intermediária. Como as saídas de fórmula podem mudar sem um sinal de cursor, este design mantém os campos de fórmula separados da ingestão incremental baseada em cursor.

O resultado final é uma única view materializada por tabela que faz o join dos campos não-fórmula mantidos incrementalmente com os campos de fórmula recalculados. Isso evita refazer o snapshot de toda a tabela em cada execução.

nota

A tabela de transmissão intermediária que contém campos não-fórmula é nomeada como <destination-table>_without_formula_fields. Como os campos não-fórmula usam detecção de alterações baseada em cursor, esta tabela registra uma alteração para uma linha somente quando os dados não-fórmula dessa linha são realmente alterados no Salesforce. A visualização materializada final ainda pode exibir valores de fórmula atualizados em uma execução quando a tabela de transmissão intermediária não registrou nenhuma alteração para essa linha, porque os campos de fórmula são recalculados independentemente das colunas do cursor. Isso é esperado: um valor de fórmula atualizado na visualização materializada não significa que os dados não-fórmula da linha foram alterados.

Quando um campo que não seja uma fórmula é excluído no Salesforce, a coluna correspondente no destino é marcada como inativa, mas não é excluída. Se o elemento reaparecer na origem, o pipeline falhará com um erro de coluna duplicada. Em contrapartida, quando um campo de fórmula é excluído, ele é removido da view materializada final. Se o campo reaparecer posteriormente na fonte, ele será incorporado à view materializada com os dados mais recentes.

Ao criar uma fórmula que retorna um número no Salesforce, você pode especificar a escala (o número de dígitos permitidos após a vírgula). O Salesforce arredonda automaticamente o resultado da fórmula para o número especificado de casas decimais. Para evitar erros de arredondamento cumulativos, o conector Databricks não reproduz esse comportamento.

Limitações

As limitações desta seção se aplicam quando você cria um pipeline de ingestão com campos de fórmula incrementais.

Limitações gerais

  • Não é possível ativar esse recurso em um pipeline existente. Você precisa criar um novo pipeline.
  • Este recurso é exclusivo da API. Não é possível configurá-lo usando a interface do usuário do Databricks.
  • A view materializada final não suporta SCD tipo 2. No entanto, você pode view o histórico dos campos que não são fórmulas na tabela de transmissão intermediária.

Variáveis globais suportadas

As seguintes variáveis globais do Salesforce são suportadas:

Variável global

Tabelas obrigatórias

$User

Usuário

$Organization

Organização

$Profile

Usuário, Perfil

$UserRole

Usuário, UserRole

$System.OriginDateTime

$API

$RecordType

RecordType

$Label

$Setup

Objeto de configuração personalizada referenciado

$CustomMetadata

Objeto de tipo de metadados personalizado referenciado (__mdt)

$Permission

Variável global

Tabelas obrigatórias

$User

Usuário

$Organization

Organização

$Profile

Usuário, Perfil

$UserRole

Usuário, UserRole

$System.OriginDateTime

$API

$RecordType

RecordType

$Label

$Setup

Objeto de configuração personalizada referenciado

$CustomMetadata

Objeto de tipo de metadados personalizado referenciado (__mdt)

$Permission

Algumas dessas variáveis globais dependem de dados em outras tabelas para seu cálculo. Essas tabelas dependentes também devem ser ingeridas no mesmo pipeline.

nota

Os valores para $User, $Profile, $UserRole, $Label, $Permission e $Setup são gerados dinamicamente usando os detalhes do usuário que está se conectando, pois são dependentes do usuário.

Rótulos personalizados e Translation Workbench

Ao usar a variável global $Label em fórmulas, o recurso Translation Workbench deve estar habilitado em sua organização Salesforce para acessar todos os rótulos traduzidos. Se o Translation Workbench não estiver habilitado, apenas os rótulos do idioma base serão ingeridos.

Para habilitá-lo e configurá-lo:

  1. Abra a Configuração selecionando o ícone de engrenagem.
  2. Digite Translation Language Settings na caixa de localização rápida.
  3. Selecione Configurações de idioma de tradução e clique em Habilitar .

Campos de resumo de rollup suportados

A tradução dos seguintes campos de resumo de roll-up padrão é suportada:

Objeto

Campo padrão

Objeto secundário

Quote

LineItemCount

QuoteLineItem

Quote

Subtotal

QuoteLineItem

Quote

TotalPrice

QuoteLineItem

WorkOrder

LineItemCount

WorkOrderLineItem

WorkOrder

Subtotal

WorkOrderLineItem

WorkOrder

TotalPrice

WorkOrderLineItem

DuplicateRecordSet

RecordCount

DuplicateRecordItem

ProfileSkill

UserCount

ProfileSkillUser

ProfileSkillUser

EndorsementCount

ProfileSkillEndorsement

Objeto

Campo padrão

Objeto secundário

Quote

LineItemCount

QuoteLineItem

Quote

Subtotal

QuoteLineItem

Quote

TotalPrice

QuoteLineItem

WorkOrder

LineItemCount

WorkOrderLineItem

WorkOrder

Subtotal

WorkOrderLineItem

WorkOrder

TotalPrice

WorkOrderLineItem

DuplicateRecordSet

RecordCount

DuplicateRecordItem

ProfileSkill

UserCount

ProfileSkillUser

ProfileSkillUser

EndorsementCount

ProfileSkillEndorsement

Para o cálculo dos campos de resumo de rollup padrão acima, o objeto filho respectivo deve ser ingerido no mesmo pipeline.

Além desses campos padrão, campos de resumo de rollup personalizados em qualquer objeto Salesforce também são suportados. Assim como nos campos padrão, o objeto filho resumido deve ser ingerido no mesmo pipeline.

Limitações do campo de resumo de rollup

  • Os campos de resumo de rollup são calculados independentemente da detecção de alterações baseada em cursor. Ao contrário de campos que não são de fórmula, os valores de rollup de um registro pai podem ser atualizados sem que o próprio registro pai seja marcado como alterado.
  • Campos de resumo de rollup que filtram registros secundários excluídos não são suportados.
  • Campos de resumo de rollup cujo filtro inclui funções de fórmula não suportadas são marcados como erros na tabela de acompanhamento de erros e não são ingeridos incrementalmente.

Campos de fórmula e funções não suportados

importante

Se um campo de fórmula em uma tabela fizer referência a uma coluna em outra tabela, ambas as tabelas deverão ser processadas pelo mesmo pipeline.

Por exemplo, se table_A.column_X for um campo de fórmula que referencia table_B.column_Y, você deve configurar o pipeline para ingerir tanto table_A quanto table_B.

  • Os campos que fazem referência a tabelas ou colunas que não estão atualmente sendo ingeridas no pipeline não são ingeridos incrementalmente.

  • As seguintes funções de fórmula não são suportadas:

    • GETSESSIONID
    • RUNASUSER
    • CURRENCYRATE
    • ISCLONE
    • VLOOKUP
    • GETRECORDIDS
    • PARENTGROUPVAL
    • PREVGROUPVAL
    • PRIORVALUE
    • ISCHANGED
    • ISNEW
    • PREDICT
    • MLPREDICT
    • IMAGEPROXYURL
    • JUNCTIONIDLIST
    • LINKTO
    • LINKGROUPVAL
    • REQUIRESCRIPT
    • URLFOR
    • GEOLOCATION
    • DISTANCE
    • HTMLENCODE
    • JSENCODE
    • JSINHTMLENCODE
    • URLENCODE
    • INCLUDE
  • Entidades globais, exceto aquelas listadas em Variáveis globais suportadas, não são suportadas.

  • Fórmulas que usam ROUND(arg1, arg2) não são suportadas a menos que arg2 seja um inteiro estático.

  • Fórmulas com resultados que excedem a precisão decimal(38,18), como uma fórmula que multiplica dois decimais de precisão (30,18). Esses fatores causam a falha do pipeline. Para excluí-los, use a configuração exclude_columns . Consulte Selecionar colunas para ingestão.

Funções com resultados ambíguos

As seguintes funções podem produzir resultados diferentes no Databricks em comparação com o Salesforce:

Função

Diferença de comportamento

LEN(TEXT(<decimal_number>)), como LEN("123.45")

Como o Databricks é mais preciso que o Salesforce, essa função retorna um valor diferente no Databricks do que no Salesforce.

CHR(x)

No Salesforce, esta função retorna o caractere com o código ASCII especificado por x. No Databricks, retorna o caractere cujo código ASCII é igual a x módulo 256.

INITCAP("_mrSmith is _ok")

No Salesforce, esta função coloca em maiúscula a primeira letra de cada palavra, ignorando caracteres não alfabéticos, resultando em "_MrSmith Is Ok". No Databricks, esta função coloca em maiúscula o primeiro caractere de cada palavra apenas se for uma letra, resultando em "_mrSmith Is _ok".

FORMAT_DURATION

No Salesforce, quando duas entradas de data e hora estão exatamente separadas por 30 minutos, a fórmula retorna 0:00:29:59 em vez do esperado 0:00:30:00. Essa limitação não existe no Databricks, portanto pode haver uma diferença de um segundo entre os valores de origem e destino.

Função

Diferença de comportamento

LEN(TEXT(<decimal_number>)), como LEN("123.45")

Como o Databricks é mais preciso que o Salesforce, essa função retorna um valor diferente no Databricks do que no Salesforce.

CHR(x)

No Salesforce, esta função retorna o caractere com o código ASCII especificado por x. No Databricks, retorna o caractere cujo código ASCII é igual a x módulo 256.

INITCAP("_mrSmith is _ok")

No Salesforce, esta função coloca em maiúscula a primeira letra de cada palavra, ignorando caracteres não alfabéticos, resultando em "_MrSmith Is Ok". No Databricks, esta função coloca em maiúscula o primeiro caractere de cada palavra apenas se for uma letra, resultando em "_mrSmith Is _ok".

FORMAT_DURATION

No Salesforce, quando duas entradas de data e hora estão exatamente separadas por 30 minutos, a fórmula retorna 0:00:29:59 em vez do esperado 0:00:30:00. Essa limitação não existe no Databricks, portanto pode haver uma diferença de um segundo entre os valores de origem e destino.

Crie um pipeline com campos de fórmula incrementais.

Para habilitar a ingestão incremental de campos de fórmula, você deve criar um novo pipeline com o sinalizador de configuração pipelines.enableSalesforceFormulaFieldsMVComputation: true. Não é possível ativar este recurso em um pipeline existente. Para ver exemplos de código, consulte Ingerir campos de fórmula incrementalmente.

Entenda a tabela de erros de envio

Ao ativar a ingestão incremental de campos de fórmula, o conector cria uma tabela adicional para auxiliar na resolução de problemas. Esta tabela sempre aparece se o indicador de campos de fórmula incrementais estiver ativado, mesmo que não haja erros. A tabela de acompanhamento de erros (denominada <pipeline-id>_formula_fields_error_reasons) possui as seguintes colunas:

  • <source-object>: O nome do objeto de origem no Salesforce.
  • <formula-field>: O nome do campo da fórmula.
  • errorMensagem de erro que explica por que a fórmula não foi processada incrementalmente.

Se um campo de fórmula mostrar valores NULL na sua tabela de destino, consulte a tabela de acompanhamento de erros para entender por que o campo não foi ingerido incrementalmente. Para obter detalhes, consulte Os valores do campo de fórmula são exibidos como NULL (ingestão incremental).