Ingérer les champs de formule Salesforce de manière incrémentielle
Bêta
Cette fonctionnalité est en Bêta.
Par default, Lakeflow Connect n'ingère pas de manière incrémentielle les champs de formule Salesforce. Au lieu de cela, il prend un instantané des champs de formule à chaque exécution de pipeline, puis les joint avec le reste de la table. Cependant, vous pouvez activer l'ingestion incrémentielle des champs de formule, ce qui améliore souvent considérablement les performances et réduit les coûts.
Pourquoi les champs de formule sont-ils ingérés différemment
Salesforce calcule les champs de formule dynamiquement lors de la lecture plutôt que de les stocker comme des valeurs statiques. Une formule telle qu'une qui utilise TODAY() ou NOW() peut produire un résultat différent à chaque lecture, même si rien concernant l'enregistrement sous-jacent n'a changé.
Les colonnes curseurs Salesforce (comme SystemModstamp ou LastModifiedDate) suivent les modifications apportées à l'enregistrement lui-même, et non les modifications apportées aux sorties de formule. Lorsqu'un résultat de formule change, Salesforce ne fait pas avancer les colonnes curseurs. Étant donné que l'ingestion incrémentale repose sur ces colonnes curseurs pour détecter les lignes modifiées, les champs de formule ne peuvent pas être ingérés de manière incrémentale de la même manière que les champs ordinaires : une sortie de formule peut changer sans qu'aucune colonne curseur n'avance, donc une lecture incrémentale standard la manquerait silencieusement.
Pour gérer cela, Lakeflow Connect sépare les deux types de champs et utilise une stratégie de refresh différente pour chacun, décrite dans la section suivante.
Fonctionnement de l'ingestion incrémentielle des champs de formule
Si vous utilisez l’approche default d’instantané, le résultat final d’un pipeline d’ingestion Salesforce est une série de tables de streaming (une par table source), et les champs de formule sont ré-instantanés et joints à chaque exécution.
Si vous utilisez plutôt l'ingestion incrémentielle de champs de formule, le connecteur divise chaque table en deux parties :
- Les **champs sans formule** sont ingérés de manière incrémentielle dans une table de streaming intermédiaire. Le connecteur applique uniquement les lignes qui ont réellement changé dans Salesforce, en utilisant les colonnes de curseur pour détecter les changements (le comportement standard de capture incrémentale des modifications de données).
- Les champs de formule sont recréés en tant que vue matérialisée qui recalcule la logique de formule au-dessus de la table de streaming intermédiaire. Puisque les sorties de formule peuvent changer sans signal de curseur, cette conception maintient les champs de formule séparés de l'ingestion incrémentale basée sur un curseur.
Le résultat final est une vue matérialisée unique par table qui joint les champs non-formule maintenus de manière incrémentielle aux champs de formule recalculés. Ceci évite de recréer un instantané de la table entière à chaque exécution.
Le tableau de streaming intermédiaire qui contient des champs non formulés est nommé <destination-table>_without_formula_fields. Étant donné que les champs non-formules utilisent la détection des changements basée sur le curseur, cette table enregistre une modification pour une ligne uniquement lorsque les données non-formules de cette ligne changent réellement dans Salesforce. La vue matérialisée finale peut toujours afficher les valeurs de formule mises à jour lors d'une exécution, même lorsque la table de streaming intermédiaire n'a enregistré aucune modification pour cette ligne, car les champs de formule sont recalculés indépendamment des colonnes du curseur. C'est prévu : une valeur de formule mise à jour dans la vue matérialisée ne signifie pas que les données non-formules de la ligne ont changé.
Lorsqu'un champ non-formule est supprimé dans Salesforce, la colonne correspondante dans la destination est marquée comme inactive mais n'est pas supprimée. S'il réapparaît dans la source, le pipeline échoue avec une erreur de colonne en double. En revanche, lorsqu'un champ de formule est supprimé, il est supprimé de la vue matérialisée finale. Si le champ réapparaît plus tard dans la source, il est ingéré dans la vue matérialisée avec les dernières données.
Lorsque vous créez une formule qui renvoie un nombre dans Salesforce, vous pouvez spécifier la précision (le nombre de chiffres autorisés après la virgule). Salesforce arrondit automatiquement le résultat de la formule au nombre de décimales spécifié. Pour éviter les erreurs d'arrondi cumulées, le connecteur Databricks ne reproduit pas ce comportement.
Limitations
Les limitations de cette section s'appliquent lorsque vous créez un pipeline d’ingestion avec des champs de formule incrémentiels.
Limitations générales
- Vous ne pouvez pas activer cette fonctionnalité sur un pipeline existant. Vous devez créer un nouveau pipeline.
- Cette fonctionnalité est uniquement accessible via l'API. Vous ne pouvez pas le configurer à l'aide de l'interface utilisateur Databricks.
- La vue matérialisée finale ne prend pas en charge le SCD de type 2. Cependant, vous pouvez consulter l'historique des champs non formulés dans la table de streaming intermédiaire.
Champs et fonctions de formule non pris en charge
Si un champ de formule dans une table référence une colonne dans une autre table, les deux tables doivent être ingérées par le même pipeline.
Par exemple, si table_A.column_X est un champ de formule qui référence table_B.column_Y, vous devez configurer le pipeline pour ingérer à la fois table_A et table_B.
-
Les champs qui référencent des tables ou des colonnes qui ne sont pas actuellement ingérées dans le pipeline ne sont pas ingérés de manière incrémentielle.
-
Les fonctions de formule suivantes ne sont pas prises en charge :
GETSESSIONIDRUNASUSERCURRENCYRATEISCLONEVLOOKUPGETRECORDIDSPARENTGROUPVALPREVGROUPVALPRIORVALUEISCHANGEDISNEWPREDICTMLPREDICTIMAGEPROXYURLJUNCTIONIDLISTLINKTOLINKGROUPVALREQUIRESCRIPTURLFORGEOLOCATIONDISTANCEHTMLENCODEJSENCODEJSINHTMLENCODEURLENCODEINCLUDE
-
Les champs récapitulatifs et les formules qui y font référence ne sont pas pris en charge.
-
Les entités globales (par exemple,
$User,$Profile) ne sont pas prises en charge. -
Les formules qui utilisent
ROUND(arg1, arg2)ne sont pas prises en charge, sauf siarg2est un entier statique. -
Formules avec des sorties qui dépassent la précision
decimal(38,18), telles qu'une formule qui multiplie deux décimales de précision(30,18). Ces éléments entraînent l'échec du pipeline. Pour les exclure, utilisez la configurationexclude_columns. Voir Sélectionner les colonnes à ingérer.
Fonctions aux résultats ambigus
Les fonctions suivantes peuvent donner des résultats différents dans Databricks par rapport à Salesforce :
Fonction | Différence de comportement |
|---|---|
| Étant donné que Databricks est plus précis que Salesforce, cette fonction renvoie une valeur différente dans Databricks que dans Salesforce. |
| Dans Salesforce, cette fonction renvoie le caractère avec le code ASCII spécifié par |
| Dans Salesforce, cette fonction met en majuscule la première lettre de chaque mot, en ignorant les caractères non alphabétiques, donnant |
| Dans Salesforce, lorsque deux entrées de date et d'heure sont exactement séparées de 30 minutes, la formule produit |
Créer un pipeline avec des champs de formule incrémentiels
Pour activer l’ingestion incrémentielle des champs de formule, vous devez créer un nouveau pipeline avec l’indicateur de configuration pipelines.enableSalesforceFormulaFieldsMVComputation: true. Vous ne pouvez pas activer cette fonctionnalité sur les pipelines existants. Pour un exemple de code, consultez Ingérer des champs de formule de manière incrémentielle.
Comprendre la table de suivi des erreurs
Lorsque vous activez l'ingestion incrémentielle des champs de formule, le connecteur crée un tableau supplémentaire pour faciliter le dépannage. Ce tableau apparaît toujours si l'indicateur de champs de formule incrémentiels est défini, même s'il n'y a pas d'erreurs. Le tableau de suivi des erreurs (nommé <pipeline-id>_formula_fields_error_reasons) a les colonnes suivantes :
<source-object>: Le nom de l'objet source dans Salesforce.<formula-field>: Nom du champ de formule.error: Message d'erreur expliquant pourquoi la formule n'a pas été ingérée de manière incrémentielle.
Si un champ de formule affiche des valeurs NULL dans votre table de destination, query la table de suivi des erreurs pour comprendre pourquoi le champ n'a pas été ingéré de manière incrémentielle. Pour plus de détails, voir Les valeurs de champ de formule s'affichent comme NULL (ingestion incrémentielle).