Salesforce の数式フィールドを段階的に取り込む
ベータ版
この機能はベータ版です。
ちなみに、 LakeFlow Connect Salesforce 数式フィールドを段階的に取り込みません。 代わりに、パイプラインの実行ごとに数式フィールドのスナップショットを取得し、それらをテーブルの残りの部分と結合します。ただし、増分式フィールドの取り込みを有効にすると、パフォーマンスが大幅に向上し、コストが削減されることがよくあります。
数式フィールドが異なって取り込まれる理由
Salesforce は、数式フィールドを静的な値として保存するのではなく、読み取り時に動的にコンピュートします。TODAY() または NOW() を使用するような数式は、基になるレコードに変更がない場合でも、読み取りごとに異なる結果を生成する可能性があります。
Salesforceカーソル列(SystemModstampやLastModifiedDateなど)は、レコード自体の変更を追跡し、数式出力の変更は追跡しません。数式の結果が変更されても、Salesforceはカーソル列を進めません。増分取り込みは、変更された行を検出するためにそれらのカーソル列に依存しているため、数式フィールドを通常のフィールドと同じ方法で増分的に取り込むことはできません。数式出力はカーソル列が進まなくても変更される可能性があり、標準の増分読み取りではそれを検出できません。
これに対処するため、Lakeflow Connect は 2 種類のフィールドを分離し、それぞれに異なる更新戦略を使用します。これは次のセクションで説明します。
増分式フィールド取り込みの仕組み
デフォルトのスナップショットアプローチを使用する場合、Salesforce インジェストパイプラインの最終結果は一連のストリーミングテーブル(ソーステーブルごとに 1 つ)であり、数式フィールドは実行ごとに再スナップショットされ、結合されます。
その代わりに増分数式フィールド取り込みを使用する場合、コネクタは各テーブルを 2 つの部分に分割します。
- 非数式フィールド は、中間ストリーミングテーブルに増分的に取り込まれます。コネクタが適用するのは、カーソル列を使用して変更を検出する (標準的な増分チェンジデータキャプチャの動作である) Salesforce で実際に変更された行のみです。
- **数式フィールド**は、中間ストリーミングテーブルの数式ロジックを再計算するマテリアライズドビューとして再作成されます。カーソルシグナルなしで数式出力が変更される可能性があるため、この設計では数式フィールドをカーソルベースの増分取り込みとは別に保持します。
最終的な結果は、増分的に維持される非数式フィールドと再計算された数式フィールドを結合する、テーブルごとの単一のマテリアライズドビューとなります。これにより、実行ごとにテーブル全体の再スナップショット作成を回避します。
数式以外のフィールドを保持する中間ストリーミングテーブルは<destination-table>_without_formula_fieldsという名前です。数式以外のフィールドはカーソルベースの変更検出を使用するため、このテーブルは、その行の数式以外のデータがSalesforceで実際に変更された場合にのみ、行の変更を記録します。数式フィールドはカーソル列とは独立して再計算されるため、中間ストリーミングテーブルがその行の変更を記録しなかった場合でも、最終的なマテリアライズドビューは実行時に更新された数式の値を引き続き表示できます。これは予期される動作です。マテリアライズドビューの数式の値が更新されても、その行の数式以外のデータが変更されたことを意味するわけではありません。
Salesforce で数式以外のフィールドが削除されると、宛先の対応する列は非アクティブとしてマークされますが、削除されません。ソースに再び出現すると、重複列エラーが発生してパイプラインが失敗します。対照的に、数式フィールドが削除されると、その数式フィールドは最終的なマテリアライズドビューから削除されます。 後でフィールドがソースに再表示されると、そのフィールドは最新のデータとともにマテリアライズドビューに取り込まれます。
Salesforce で数値を返す数式を作成するときに、スケール (小数点以下の桁数) を指定できます。Salesforce は、数式の結果を指定された小数点以下の桁数に自動的に丸めます。累積的な丸め誤差を回避するために、Databricks コネクタはこの動作を再現しません。
制限事項
このセクションの制限は、増分数式フィールドを使用して取り込みパイプラインを作成するときに適用されます。
一般的な制限
- 既存のパイプラインでこの機能を有効にすることはできません。新しいパイプラインを作成する必要があります。
- この機能は API のみです。Databricks UI を使用して構成することはできません。
- 最終的なマテリアライズドビューはSCDタイプ 2 をサポートしません。ただし、中間ストリーミング テーブルで非数式フィールドの履歴を表示できます。
サポートされていない数式フィールドと関数
あるテーブルの数式フィールドが別のテーブルの列を参照している場合、両方のテーブルを同じパイプラインで取り込む必要があります。
例えば、 table_A.column_X table_B.column_Yを参照する数式フィールドである場合、パイプラインを構成してtable_Aとtable_B両方を取り込む必要があります。
-
現在パイプラインに取り込まれていないテーブルまたは列を参照するフィールドは、増分的に取り込まれません。
-
次の数式関数はサポートされていません。
GETSESSIONIDRUNASUSERCURRENCYRATEISCLONEVLOOKUPGETRECORDIDSPARENTGROUPVALPREVGROUPVALPRIORVALUEISCHANGEDISNEWPREDICTMLPREDICTIMAGEPROXYURLJUNCTIONIDLISTLINKTOLINKGROUPVALREQUIRESCRIPTURLFORGEOLOCATIONDISTANCEHTMLENCODEJSENCODEJSINHTMLENCODEURLENCODEINCLUDE
-
ロールアップ集計フィールドとそれを参照する数式はサポートされていません。
-
グローバル エンティティ (たとえば、
$User、$Profile) はサポートされていません。 -
arg2が静的な整数でない限り、ROUND(arg1, arg2)を使用する数式はサポートされません。 -
精度
(30,18)の 2 つの小数を乗算する数式など、出力が精度decimal(38,18)を超える数式。これらによりパイプラインが失敗します。除外するには、exclude_columns構成を使用します。「取り込む列の選択」を参照してください。
曖昧な結果をもたらす関数
次の関数は、Databricks と Salesforce で異なる結果をもたらす可能性があります。
関数 | 行動の違い |
|---|---|
| Databricks は Salesforce よりも精度が高いため、この関数は Databricks と Salesforce で異なる値を返します。 |
| Salesforce では、この関数は |
| Salesforce では、この関数はアルファベット以外の文字を無視して各単語の最初の文字を大文字にして、 |
| Salesforce では、2 つの日時入力の時間がちょうど 30 分離れている場合、数式は期待される |
増分式フィールドを使用してパイプラインを作成する
増分数式フィールドの取り込みを有効にするには、構成フラグpipelines.enableSalesforceFormulaFieldsMVComputation: trueを使用して新しいパイプラインを作成する必要があります。既存のパイプラインでこの機能を有効にすることはできません。コード例については、 「数式フィールドを段階的に取り込む」を参照してください。
エラー追跡テーブルを理解する
増分数式フィールドの取り込みを有効にすると、コネクタはトラブルシューティングに役立つ追加のテーブルを作成します。増分数式フィールド フラグが設定されている場合は、エラーがない場合でもこのテーブルが常に表示されます。エラー追跡テーブル (名前: <pipeline-id>_formula_fields_error_reasons ) には次の列があります。
<source-object>: Salesforce 内のソース オブジェクトの名前。<formula-field>: 数式フィールドの名前。error: 数式が増分的に取り込まれなかった理由を説明するエラー メッセージ。
宛先テーブルの数式フィールドにNULL値が表示される場合は、エラー トラッキング テーブルをクエリして、フィールドが増分的に取り込まれなかった理由を把握します。詳細については、 「数式フィールドの値がNULLとして表示される (増分取り込み)」を参照してください。