メインコンテンツまでスキップ

Salesforce の数式フィールドを段階的に取り込む

備考

ベータ版

この機能はベータ版です。

ちなみに、 LakeFlow Connect Salesforce 数式フィールドを段階的に取り込みません。 代わりに、パイプラインの実行ごとに数式フィールドのスナップショットを取得し、それらをテーブルの残りの部分と結合します。ただし、増分式フィールドの取り込みを有効にすると、パフォーマンスが大幅に向上し、コストが削減されることがよくあります。

数式フィールドが異なって取り込まれる理由

Salesforce は、数式フィールドを静的な値として保存するのではなく、読み取り時に動的にコンピュートします。TODAY() または NOW() を使用するような数式は、基になるレコードに変更がない場合でも、読み取りごとに異なる結果を生成する可能性があります。

Salesforceカーソル列(SystemModstampLastModifiedDateなど)は、レコード自体の変更を追跡し、数式出力の変更は追跡しません。数式の結果が変更されても、Salesforceはカーソル列を進めません。増分取り込みは、変更された行を検出するためにそれらのカーソル列に依存しているため、数式フィールドを通常のフィールドと同じ方法で増分的に取り込むことはできません。数式出力はカーソル列が進まなくても変更される可能性があり、標準の増分読み取りではそれを検出できません。

これに対処するため、Lakeflow Connect は 2 種類のフィールドを分離し、それぞれに異なる更新戦略を使用します。これは次のセクションで説明します。

増分式フィールド取り込みの仕組み

デフォルトのスナップショットアプローチを使用する場合、Salesforce インジェストパイプラインの最終結果は一連のストリーミングテーブル(ソーステーブルごとに 1 つ)であり、数式フィールドは実行ごとに再スナップショットされ、結合されます。

その代わりに増分数式フィールド取り込みを使用する場合、コネクタは各テーブルを 2 つの部分に分割します。

  • 非数式フィールド は、中間ストリーミングテーブルに増分的に取り込まれます。コネクタが適用するのは、カーソル列を使用して変更を検出する (標準的な増分チェンジデータキャプチャの動作である) Salesforce で実際に変更された行のみです。
  • **数式フィールド**は、中間ストリーミングテーブルの数式ロジックを再計算するマテリアライズドビューとして再作成されます。カーソルシグナルなしで数式出力が変更される可能性があるため、この設計では数式フィールドをカーソルベースの増分取り込みとは別に保持します。

最終的な結果は、増分的に維持される非数式フィールドと再計算された数式フィールドを結合する、テーブルごとの単一のマテリアライズドビューとなります。これにより、実行ごとにテーブル全体の再スナップショット作成を回避します。

注記

数式以外のフィールドを保持する中間ストリーミングテーブルは<destination-table>_without_formula_fieldsという名前です。数式以外のフィールドはカーソルベースの変更検出を使用するため、このテーブルは、その行の数式以外のデータがSalesforceで実際に変更された場合にのみ、行の変更を記録します。数式フィールドはカーソル列とは独立して再計算されるため、中間ストリーミングテーブルがその行の変更を記録しなかった場合でも、最終的なマテリアライズドビューは実行時に更新された数式の値を引き続き表示できます。これは予期される動作です。マテリアライズドビューの数式の値が更新されても、その行の数式以外のデータが変更されたことを意味するわけではありません。

Salesforce で数式以外のフィールドが削除されると、宛先の対応する列は非アクティブとしてマークされますが、削除されません。ソースに再び出現すると、重複列エラーが発生してパイプラインが失敗します。対照的に、数式フィールドが削除されると、その数式フィールドは最終的なマテリアライズドビューから削除されます。 後でフィールドがソースに再表示されると、そのフィールドは最新のデータとともにマテリアライズドビューに取り込まれます。

Salesforce で数値を返す数式を作成するときに、スケール (小数点以下の桁数) を指定できます。Salesforce は、数式の結果を指定された小数点以下の桁数に自動的に丸めます。累積的な丸め誤差を回避するために、Databricks コネクタはこの動作を再現しません。

制限事項

このセクションの制限は、増分数式フィールドを使用して取り込みパイプラインを作成するときに適用されます。

一般的な制限

  • 既存のパイプラインでこの機能を有効にすることはできません。新しいパイプラインを作成する必要があります。
  • この機能は API のみです。Databricks UI を使用して構成することはできません。
  • 最終的なマテリアライズドビューはSCDタイプ 2 をサポートしません。ただし、中間ストリーミング テーブルで非数式フィールドの履歴を表示できます。

サポートされているグローバル変数

次のSalesforceグローバル変数がサポートされています。

グローバル変数

必須テーブル

$User

ユーザー

$Organization

組織

$Profile

ユーザー、プロファイル

$UserRole

ユーザー、UserRole

$System.OriginDateTime

$API

$RecordType

RecordType

$Label

$Setup

参照されるカスタム設定オブジェクト

$CustomMetadata

参照されるカスタム メタデータ型 (__mdt) オブジェクト

$Permission

グローバル変数

必須テーブル

$User

ユーザー

$Organization

組織

$Profile

ユーザー、プロファイル

$UserRole

ユーザー、UserRole

$System.OriginDateTime

$API

$RecordType

RecordType

$Label

$Setup

参照されるカスタム設定オブジェクト

$CustomMetadata

参照されるカスタム メタデータ型 (__mdt) オブジェクト

$Permission

これらのグローバル変数の一部は、そのコンピュートのために他のテーブルのデータに依存しています。これらの依存テーブルも、同じパイプラインに取り込む必要があります。

注記

$User$Profile$UserRole$Label$Permission、および$Setupの値は、ユーザーに依存するため、接続しているユーザーの詳細を使用して動的に生成されます。

カスタムラベルと Translation Workbench

数式で $Label グローバル変数を使用する場合、すべての翻訳済みラベルにアクセスするには、Salesforce 組織で Translation Workbench 機能を有効にする必要があります。Translation Workbench が有効になっていない場合、基本言語のラベルのみが取り込まれます。

有効化および設定するには:

  1. 歯車アイコンを選択して Setup を開きます。
  2. クイック検索ボックスにTranslation Language Settingsを入力します。
  3. 翻訳言語設定 を選択し、 有効化 をクリックします。

サポートされているロールアップサマリーフィールド

以下の標準ロールアップサマリーフィールドの変換がサポートされています:

オブジェクト

標準フィールド

子オブジェクト

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

オブジェクト

標準フィールド

子オブジェクト

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

上記の標準ロールアップ集計フィールドを計算するには、対応する子オブジェクトを同じパイプラインに取り込む必要があります。

これらの標準フィールドに加えて、任意の Salesforce オブジェクト上のカスタムロールアップ集計フィールドもサポートされています。標準フィールドと同様に、集計された子オブジェクトは同じパイプラインで取り込む必要があります。

ロールアップサマリーフィールドの制限

  • ロールアップサマリーフィールドは、カーソルベースの変更検出とは独立して計算されます。非数式フィールドとは異なり、親レコードのロールアップ値は、親レコード自体が変更済みとしてマークされなくても更新される可能性があります。
  • 削除された子レコードでフィルタリングするロールアップサマリーフィールドはサポートされていません。
  • フィルターにサポートされていない数式関数が含まれているロールアップ集計項目は、エラー追跡テーブルでエラーとしてマークされ、増分取り込みは行われません。

サポートされていない数式フィールドと関数

重要

あるテーブルの数式フィールドが別のテーブルの列を参照している場合、両方のテーブルを同じパイプラインで取り込む必要があります。

例えば、 table_A.column_X table_B.column_Yを参照する数式フィールドである場合、パイプラインを構成してtable_Atable_B両方を取り込む必要があります。

  • 現在パイプラインに取り込まれていないテーブルまたは列を参照するフィールドは、増分的に取り込まれません。

  • 次の数式関数はサポートされていません。

    • 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
  • サポートされているグローバル変数に記載されているもの以外のグローバルエンティティはサポートされていません。

  • arg2が静的な整数でない限り、 ROUND(arg1, arg2)を使用する数式はサポートされません。

  • 精度(30,18)の 2 つの小数を乗算する数式など、出力が精度decimal(38,18)を超える数式。これらによりパイプラインが失敗します。除外するには、 exclude_columns構成を使用します。「取り込む列の選択」を参照してください。

曖昧な結果をもたらす関数

次の関数は、Databricks と Salesforce で異なる結果をもたらす可能性があります。

関数

行動の違い

LEN(TEXT(<decimal_number>))、 のような LEN("123.45")

Databricks は Salesforce よりも精度が高いため、この関数は Databricks と Salesforce で異なる値を返します。

CHR(x)

Salesforce では、この関数はxで指定された ASCII コードの文字を返します。Databricks では、ASCII コードがxを 256 で割った値に等しい文字を返します。

INITCAP("_mrSmith is _ok")

Salesforce では、この関数はアルファベット以外の文字を無視して各単語の最初の文字を大文字にして、 "_MrSmith Is Ok"を生成します。Databricks では、この関数は、各単語の最初の文字が文字である場合にのみその文字を大文字にして、 "_mrSmith Is _ok"を生成します。

FORMAT_DURATION

Salesforce では、2 つの日時入力の時間がちょうど 30 分離れている場合、数式は期待される0:00:30:00ではなく0:00:29:59を出力します。この制限は Databricks には存在しないため、ソース値と宛先値の間に 1 秒のギャップが生じる可能性があります。

関数

行動の違い

LEN(TEXT(<decimal_number>))、 のような LEN("123.45")

Databricks は Salesforce よりも精度が高いため、この関数は Databricks と Salesforce で異なる値を返します。

CHR(x)

Salesforce では、この関数はxで指定された ASCII コードの文字を返します。Databricks では、ASCII コードがxを 256 で割った値に等しい文字を返します。

INITCAP("_mrSmith is _ok")

Salesforce では、この関数はアルファベット以外の文字を無視して各単語の最初の文字を大文字にして、 "_MrSmith Is Ok"を生成します。Databricks では、この関数は、各単語の最初の文字が文字である場合にのみその文字を大文字にして、 "_mrSmith Is _ok"を生成します。

FORMAT_DURATION

Salesforce では、2 つの日時入力の時間がちょうど 30 分離れている場合、数式は期待される0:00:30:00ではなく0:00:29:59を出力します。この制限は Databricks には存在しないため、ソース値と宛先値の間に 1 秒のギャップが生じる可能性があります。

増分式フィールドを使用してパイプラインを作成する

増分数式フィールドの取り込みを有効にするには、構成フラグpipelines.enableSalesforceFormulaFieldsMVComputation: trueを使用して新しいパイプラインを作成する必要があります。既存のパイプラインでこの機能を有効にすることはできません。コード例については、 「数式フィールドを段階的に取り込む」を参照してください。

エラー追跡テーブルを理解する

増分数式フィールドの取り込みを有効にすると、コネクタはトラブルシューティングに役立つ追加のテーブルを作成します。増分数式フィールド フラグが設定されている場合は、エラーがない場合でもこのテーブルが常に表示されます。エラー追跡テーブル (名前: <pipeline-id>_formula_fields_error_reasons ) には次の列があります。

  • <source-object>: Salesforce 内のソース オブジェクトの名前。
  • <formula-field>: 数式フィールドの名前。
  • error: 数式が増分的に取り込まれなかった理由を説明するエラー メッセージ。

宛先テーブルの数式フィールドにNULL値が表示される場合は、エラー トラッキング テーブルをクエリして、フィールドが増分的に取り込まれなかった理由を把握します。詳細については、 「数式フィールドの値がNULLとして表示される (増分取り込み)」を参照してください。