Ingerir campos de fórmula do Salesforce de forma incremental
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.
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.
Campos de fórmula e funções não suportados
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:
GETSESSIONIDRUNASUSERCURRENCYRATEISCLONEVLOOKUPGETRECORDIDSPARENTGROUPVALPREVGROUPVALPRIORVALUEISCHANGEDISNEWPREDICTMLPREDICTIMAGEPROXYURLJUNCTIONIDLISTLINKTOLINKGROUPVALREQUIRESCRIPTURLFORGEOLOCATIONDISTANCEHTMLENCODEJSENCODEJSINHTMLENCODEURLENCODEINCLUDE
-
Campos de resumo cumulativo e fórmulas que fazem referência a eles não são suportados.
-
Entidades globais (por exemplo,
$User,$Profile) não são suportadas. -
Fórmulas que usam
ROUND(arg1, arg2)não são suportadas a menos quearg2seja 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çãoexclude_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 |
|---|---|
| Como o Databricks é mais preciso que o Salesforce, essa função retorna um valor diferente no Databricks do que no Salesforce. |
| No Salesforce, esta função retorna o caractere com o código ASCII especificado por |
| No Salesforce, esta função coloca em maiúscula a primeira letra de cada palavra, ignorando caracteres não alfabéticos, resultando em |
| No Salesforce, quando duas entradas de data e hora estão exatamente separadas por 30 minutos, a fórmula retorna |
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).