コンテンツにスキップ

ベストプラクティス

Brazeクラウドデータ取り込みを使用すると、データウェアハウスやファイルストレージシステムからBrazeへの直接接続を設定して、関連するユーザーデータやカタログデータを同期できます。このデータをBrazeに同期すると、パーソナライゼーション、トリガー、セグメンテーションなどのユースケースに活用できます。

UPDATED_ATによる変更の追跡

同期が実行されると、Brazeはデータウェアハウスインスタンスに直接接続し、各行のUPDATED_ATタイムスタンプを使用して変更を追跡します。UPDATED_ATは、すべてのデータウェアハウス同期で必須のフィールドです。

例:定期同期の動作

CDI同期でUPDATED_ATがどのように使用されるかを説明するために、ユーザー属性を更新する定期同期の例を見てみましょう。

同期が実行されるたびに、CDIはまだ同期されていない行を検索します。CDIはテーブルまたはビューのUPDATED_AT列を使用してこれを確認します。Brazeは、UPDATED_ATが最後に同期されたUPDATED_ATの値よりも新しいすべての行を選択してインポートします。境界のタイムスタンプと完全に一致する行も、同じタイムスタンプの新しい行が実行間で追加された場合に再同期される可能性があります。

データウェアハウスで、以下のユーザーと属性をテーブルに追加し、UPDATED_ATの時刻をデータを追加した時刻に設定します。

UPDATED_AT EXTERNAL_ID PAYLOAD
2022-07-17 08:30:00 customer_1234
1
2
3
4
5
6
7
8
{
    "attribute_1":"abcdefg",
    "attribute_2": {
        "attribute_a":"example_value_1",
        "attribute_b":"example_value_1"
    },
    "attribute_3":"2019-07-16T19:20:30+1:00"
}
2022-07-18 11:59:23 customer_3456
1
2
3
4
5
6
{
    "attribute_1":"abcdefg",
    "attribute_2":42,
    "attribute_3":"2019-07-16T19:20:30+1:00",
    "attribute_5":"testing"
}
2022-07-19 09:07:23 customer_5678
1
2
3
4
5
{
    "attribute_1":"abcdefg",
    "attribute_4":true,
    "attribute_5":"testing_123"
}

次のスケジュールされた同期では、Brazeは最後に同期されたタイムスタンプよりも新しいUPDATED_ATタイムスタンプを持つすべての行を同期します。Brazeはフィールドを更新または追加するため、毎回完全なユーザープロファイルを同期する必要はありません。同期後、ユーザープロファイルには新しい更新が反映されます。

定期同期、2回目の実行:2022年7月20日 12:00 PM

UPDATED_AT EXTERNAL_ID PAYLOAD
2022-07-17 08:30:00 customer_1234
1
2
3
4
5
6
7
8
{
    "attribute_1":"abcdefg",
    "attribute_2": {
        "attribute_a":"example_value_2",
        "attribute_b":"example_value_2"
    },
    "attribute_3":"2019-07-16T19:20:30+1:00"
}
2022-07-18 11:59:23 customer_3456
1
2
3
4
5
6
{
    "attribute_1":"abcdefg",
    "attribute_2":42,
    "attribute_3":"2019-07-16T19:20:30+1:00",
    "attribute_5":"testing"
}
2022-07-19 09:07:23 customer_5678
1
2
3
4
5
{
    "attribute_1":"abcdefg",
    "attribute_4":true,
    "attribute_5":"testing_123"
}
2022-07-16 00:25:30 customer_9012
1
2
3
4
5
{
    "attribute_1":"abcdefg",
    "attribute_4":false,
    "attribute_5":"testing_123"
}

customer_9012の新しい行が追加されましたが、そのUPDATED_ATの値(2022-07-16 00:25:30)は保存されたタイムスタンプ(2022-07-19 09:07:23)よりも前のため、同期されません。ただし、customer_5678の既存の行はUPDATED_ATの値が保存されたタイムスタンプと等しいため、包括的な境界により再同期されます。この動作の詳細については、重複タイムスタンプによる行の再同期を回避するを参照してください。保存されたUPDATED_ATは2022-07-19 09:07:23のままです。

定期同期、3回目の実行:2022年7月21日 12:00 PM

UPDATED_AT EXTERNAL_ID PAYLOAD
2022-07-17 08:30:00 customer_1234
1
2
3
4
5
6
7
8
{
    "attribute_1":"abcdefg",
    "attribute_2": {
        "attribute_a":"example_value_1",
        "attribute_b":"example_value_1"
    },
    "attribute_3":"2019-07-16T19:20:30+1:00"
}
2022-07-18 11:59:23 customer_3456
1
2
3
4
5
6
{
    "attribute_1":"abcdefg",
    "attribute_2":42,
    "attribute_3":"2019-07-16T19:20:30+1:00",
    "attribute_5":"testing"
}
2022-07-19 09:07:23 customer_5678
1
2
3
4
5
{
    "attribute_1":"abcdefg",
    "attribute_4":true,
    "attribute_5":"testing_123"
}
2022-07-16 00:25:30 customer_9012
1
2
3
4
5
{
    "attribute_1":"xyz",
    "attribute_4":false,
    "attribute_5":"testing_123"
}
2022-07-21 08:30:00 customer_1234
1
2
3
4
5
6
7
8
{
    "attribute_1":"abcdefg",
    "attribute_2": {
        "attribute_a":"example_value_2",
        "attribute_b":"example_value_2"
    },
    "attribute_3":"2019-07-20T19:20:30+1:00"
}

この3回目の実行では、customer_1234の新しい行が追加され、そのUPDATED_ATの値(2022-07-21 08:30:00)は保存されたタイムスタンプよりも新しいものです。この新しい行と、customer_5678の既存の行(UPDATED_ATが保存されたタイムスタンプと等しい)の両方が同期されます。保存されたUPDATED_ATは2022-07-21 08:30:00に更新されます。

データ型の問題を防ぐ

CDIを使用して外部ソース(DatabricksやSnowflakeなど)からデータを同期する場合は、同期する前にソース列で正しいデータ型が使用されていることを確認してください。よくある問題は次のとおりです。

  • 文字列として保存されたタイムスタンプ: ソースデータベースの日付列では、varcharや文字列ではなく、timestampまたはdatetime型を使用してください。
  • 文字列として保存された数値: 同期する前に、ソースクエリで数値列をintegerまたはfloat型にキャストしてください。
  • 同期間での型の不一致: 同期の間に列の型が変わると、Brazeが新しいデータを拒否する場合があります。ソーススキーマが一貫していることを確認してください。

Brazeダッシュボードでカスタム属性のデータ型を強制または変更する方法については、カスタムデータを管理するを参照してください。

ユーザーデータは、external ID、ユーザーエイリアス、Braze ID、メール、または電話番号で更新できます。ユーザーは、external ID、ユーザーエイリアス、またはBraze IDで削除できます。

UPDATED_AT 列にはUTCタイムスタンプを使用する

UPDATED_AT 列は、夏時間による問題を防ぐためにUTCである必要があります。可能な限り、CURRENT_DATE() ではなく SYSDATE() など、UTCのみを使用する関数を優先してください。

重複タイムスタンプによる行の再同期を避ける

CDIは、最後に同期されたUPDATED_ATタイムスタンプにおける行数を追跡します。CDIが前回の実行以降に同じタイムスタンプで新しい行が追加されたことを検出すると、包含境界(>=)を使用してそのタイムスタンプのすべての行(すでに処理済みのものを含む)を再選択します。それ以外の場合、CDIは排他境界(>)を使用し、最後に同期された値よりも厳密に後の行のみを選択します。

例えば、同期がUPDATED_AT = 2025-04-01 00:00:00の5行を処理し、後から同じタイムスタンプで6行目が追加された場合、次の同期はカウントの変化を検出し、6行すべてを再同期します。これにより、重複データや不要なデータポイント消費が発生する可能性があります。

これを避けるには:

  • VIEWに対して同期を設定する場合、デフォルト値としてCURRENT_TIMESTAMPを使用しないでください。UPDATED_ATフィールドがクエリの実行時刻に評価されるため、同期が実行されるたびにすべてのデータが同期されてしまいます。
  • 長時間実行されるパイプラインやクエリがソーステーブルにデータを書き込んでいる場合、同期と同時に実行することを避けるか、挿入される各行に同じタイムスタンプを使用することを避けてください。
  • トランザクションを使用して、同じタイムスタンプを共有するすべての行を書き込みます。
  • ユニークで単調増加するUPDATED_ATの値を使用して、処理済みの行が再選択されることを防ぎます。

例:後続の更新を管理する

この例では、最初にデータを同期し、その後の更新では変更されたデータ(差分)のみを更新する一般的なプロセスを示します。ユーザーデータを含むテーブルEXAMPLE_DATAがあるとします。1日目のテーブルには次の値があります:

例:後続の更新を管理する
external_id attribute_1 attribute_2 attribute_3 attribute_4
12345 823 blue 380 FALSE
23456 28 blue 823 TRUE
34567 234 blue 384 TRUE
45678 245 red 349 TRUE
56789 1938 red 813 FALSE

このデータをPAYLOAD列に変換するには、次のクエリを実行します:

SELECT
    CURRENT_TIMESTAMP AS UPDATED_AT,
    EXTERNAL_ID AS EXTERNAL_ID,
    TO_JSON(
        OBJECT_CONSTRUCT(
            'attribute_1', attribute_1,
            'attribute_2', attribute_2,
            'attribute_3', attribute_3,
            'attribute_4', attribute_4
        )
    ) AS PAYLOAD
FROM EXAMPLE_DATA;

このデータはまだBrazeに同期されていないため、CDIのソーステーブルにすべて追加します:

UPDATED_AT EXTERNAL_ID PAYLOAD
2023-03-16 15:00:00 12345 { "ATTRIBUTE_1": "823", "ATTRIBUTE_2":"blue", "ATTRIBUTE_3":"380", "ATTRIBUTE_4":"FALSE"}
2023-03-16 15:00:00 23456 { "ATTRIBUTE_1": "28", "ATTRIBUTE_2":"blue", "ATTRIBUTE_3":"823", "ATTRIBUTE_4":"TRUE"}
2023-03-16 15:00:00 34567 { "ATTRIBUTE_1": "234", "ATTRIBUTE_2":"blue", "ATTRIBUTE_3":"384", "ATTRIBUTE_4":"TRUE"}
2023-03-16 15:00:00 45678 { "ATTRIBUTE_1": "245", "ATTRIBUTE_2":"red", "ATTRIBUTE_3":"349", "ATTRIBUTE_4":"TRUE"}
2023-03-16 15:00:00 56789 { "ATTRIBUTE_1": "1938", "ATTRIBUTE_2":"red", "ATTRIBUTE_3":"813", "ATTRIBUTE_4":"FALSE"}

同期が実行され、Brazeは「2023-03-16 15:00:00」までの利用可能なすべてのデータを同期したことを記録します。次に、2日目の朝にETLが実行され、ユーザーテーブルの一部のフィールドが更新されます(*で示されています):

例:後続の更新を管理する。*は前回の同期以降に更新されたフィールドを示します。
external_id attribute_1 attribute_2 attribute_3 attribute_4
12345 145* red* 380 TRUE*
23456 15* blue 823 TRUE
34567 234 blue 495* FALSE*
45678 245 green* 349 TRUE
56789 1938 red 693* FALSE

ここで、変更された値のみをCDIソーステーブルに追加する必要があります。古い行を更新するのではなく、これらの行を追加(アペンド)できます。そのテーブルは次のようになります:

UPDATED_AT EXTERNAL_ID PAYLOAD
2023-03-16 15:00:00 12345 { "ATTRIBUTE_1": "823", "ATTRIBUTE_2":"blue", "ATTRIBUTE_3":"380", "ATTRIBUTE_4":"FALSE"}
2023-03-16 15:00:00 23456 { "ATTRIBUTE_1": "28", "ATTRIBUTE_2":"blue", "ATTRIBUTE_3":"823", "ATTRIBUTE_4":"TRUE"}
2023-03-16 15:00:00 34567 { "ATTRIBUTE_1": "234", "ATTRIBUTE_2":"blue", "ATTRIBUTE_3":"384", "ATTRIBUTE_4":"TRUE"}
2023-03-16 15:00:00 45678 { "ATTRIBUTE_1": "245", "ATTRIBUTE_2":"red", "ATTRIBUTE_3":"349", "ATTRIBUTE_4":"TRUE"}
2023-03-16 15:00:00 56789 { "ATTRIBUTE_1": "1938", "ATTRIBUTE_2":"red", "ATTRIBUTE_3":"813", "ATTRIBUTE_4":"FALSE"}
2023-03-17 09:30:00 12345 { "ATTRIBUTE_1": "145", "ATTRIBUTE_2":"red", "ATTRIBUTE_4":"TRUE"}
2023-03-17 09:30:00 23456 { "ATTRIBUTE_1": "15"}
2023-03-17 09:30:00 34567 { "ATTRIBUTE_3":"495", "ATTRIBUTE_4":"FALSE"}
2023-03-17 09:30:00 45678 { "ATTRIBUTE_2":"green"}
2023-03-17 09:30:00 56789 { "ATTRIBUTE_3":"693"}

CDIは新しい行のみを同期するため、次に実行される同期では最後の5行のみが同期されます。

その他のヒント

消費を最小限に抑えるため、新規または更新された属性のみを書き込む

同期が実行されるたびに、Brazeは以前に同期されていない行を検索します。この確認には、テーブルまたはビューのUPDATED_AT列を使用します。Brazeは、UPDATED_ATが最後に同期されたUPDATED_AT値より後の行をすべて選択してインポートします。これは、その行が現在のユーザープロファイルの内容と同じかどうかに関係ありません。また、境界のタイムスタンプと同じタイムスタンプを持つ新しい行がある場合、そのタイムスタンプの行が再同期されることもあります。そのため、追加または更新したい属性のみを同期することをお勧めします。

CDIを使用した場合のデータポイント使用量は、REST APIやSDKなどの他の取り込み方法と同じです。そのため、ソーステーブルには新規または更新された属性のみを追加するようにしてください。

EXTERNAL_IDをPAYLOAD列から分離する

PAYLOADオブジェクトには、external IDやその他のIDタイプを含めないでください。

属性を削除する

PAYLOAD列では、ユーザーのプロファイルから属性を除外したい場合に、その属性をnullに設定できます。属性を変更せずに残したい場合は、更新されるまでその属性をBrazeに送信しないでください。属性を完全に削除するには、TO_JSON(OBJECT_CONSTRUCT_KEEP_NULL(...))を使用します。

増分更新を行う

データの増分更新を行うことで、複数の更新が同時に行われた際の意図しない上書きを防ぐことができます。

この動作を防ぐ最善の方法は、CDI同期のソースデータが各ユーザーの最新の状態のみを反映するようにするか、特定のユーザーまたはユーザーと属性の組み合わせに対するすべての更新が1つの行に含まれるようにすることです。

別のテーブルからJSON文字列を作成する

PAYLOAD列を使用し、内部で各属性を個別の列に保存している場合は、それらの列をJSON文字列に変換してPAYLOADに入力します。JSON文字列を作成せずに個別の列を同期するには、代わりにVisualまたはSQLオプションを使用します。詳細については、データ定義オプションを選択するを参照してください。

各ソースのページには、そのデータウェアハウスのSQL方言による実例が掲載されています。

たとえば、Snowflakeの場合は次のようになります。

CREATE TABLE "EXAMPLE_USER_DATA"
    (attribute_1 string,
     attribute_2 string,
     attribute_3 number,
     my_user_id string);

SELECT
    CURRENT_TIMESTAMP as UPDATED_AT,
    my_user_id as EXTERNAL_ID,
    TO_JSON(
        OBJECT_CONSTRUCT (
            'attribute_1',
            attribute_1,
            'attribute_2',
            attribute_2,
            'yet_another_attribute',
            attribute_3)
    )as PAYLOAD FROM "EXAMPLE_USER_DATA";

UPDATED_ATタイムスタンプを使用する

BrazeはUPDATED_ATタイムスタンプを使用して、正常に同期されたデータをトラッキングします。CDIは、最後に同期されたタイムスタンプにおける行数もトラッキングします。実行の合間に同じタイムスタンプを持つ新しい行が追加された場合、CDIはそのタイムスタンプのすべての行を再同期するため、データが重複する可能性があります。詳細とヒントについては、タイムスタンプが重複する行の再同期を回避するを参照してください。

テーブル設定

顧客がベストプラクティスやコードスニペットを共有するための公開GitHubリポジトリがあります。ご自身のスニペットを投稿するには、プルリクエストを作成してください。

データのフォーマット

Cloud Data Ingestionのテーブル設定要件とペイロードのフォーマット要件は、Cloud Data Ingestionのテーブル設定に記載されています。

このページを参照して、次の点を区別してください。

  • ソーステーブルの要件(必須列、識別子列、UPDATED_ATの動作)
  • ペイロードの要件(各データタイプで/users/trackオブジェクト形式と一致させる必要があるフィールド)

データウェアハウスクエリのタイムアウトを回避する

最適なパフォーマンスを得て潜在的なエラーを回避するため、クエリは1時間以内に完了させることをお勧めします。クエリがこの時間を超える場合は、データウェアハウスの設定を見直すことを検討してください。ウェアハウスに割り当てられたリソースを最適化すると、クエリの実行速度を向上させることができます。

製品の制限

制限 説明
統合の数 設定できる統合の数に制限はありません。
行数 デフォルトでは、各実行で最大5億行を同期できます。新しい行が5億行を超える同期は、Brazeによって停止されます。これより高い上限が必要な場合は、Brazeのカスタマーサクセスマネージャーまたは Braze サポートにお問い合わせください。
行あたりの属性 PAYLOAD 列を使用する同期では、各行に1つのユーザー ID と、最大250個の属性を含む JSON オブジェクトを含める必要があります。JSON オブジェクト内の各キーは1つの属性としてカウントされます (つまり、配列は1つの属性としてカウントされます)。
ペイロードサイズ PAYLOAD 列を使用する同期では、各行に最大1 MBのペイロードを含めることができます。1 MBを超えるペイロードは Braze によって拒否され、関連する external ID と切り詰められたペイロードとともに、エラー「Payload was greater than 1MB」が同期ログに記録されます。
データタイプ Cloud Data Ingestion を通じて、ユーザー属性、カスタムイベント、購入イベント、カタログアイテム、ユーザー削除リクエスト、キャンバストリガーを同期できます。
Braze リージョン この製品はすべての Braze リージョンで利用できます。どの Braze リージョンからでも、任意のソースデータリージョンに接続できます。
ソースリージョン Braze は、任意のリージョンまたはクラウドプロバイダーにあるデータウェアハウスやクラウド環境に接続します。



New Stuff!