Skip to content

ベストプラクティス

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

UPDATED_AT列について

同期が実行されると、Brazeはデータウェアハウスインスタンスに直接接続し、指定されたテーブルからすべての新しいデータを取得し、Brazeダッシュボード上の対応するデータを更新します。同期が実行されるたびに、Brazeは更新されたデータを反映します。

例:定期的な同期

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

  • ファイルストレージソース
    • Amazon S3

サポートされるデータ型

Cloud Data Ingestionは以下のデータ型をサポートしています:

  • ユーザー属性(以下を含む):
    • 階層化カスタム属性
    • オブジェクトの配列
    • 購読ステータス
  • カスタムイベント
  • 購入イベント
  • カタログアイテム
  • ユーザー削除リクエスト

データ型の問題を回避する

CDIを使用して外部ソース(DatabricksやSnowflakeなど)からデータを同期する場合、同期前にソースカラムが正しいデータ型を使用していることを確認してください。一般的な問題には以下のようなものがあります:

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

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

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

同期される内容

同期が実行されるたびに、Brazeはまだ同期されていない行を検索します。これはテーブルまたはビューの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時

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の時刻が同期の時刻と同じにならないようにするを参照してください。保存されたUPDATED_AT2022-07-19 09:07:23のままです。

定期同期、3回目の実行:2022年7月21日午後12時

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)は保存されたタイムスタンプよりも後のため、同期されます。この新しい行と、保存されたタイムスタンプと同じUPDATED_ATを持つcustomer_5678の既存の行の両方が同期されます。保存されたUPDATED_AT2022-07-21 08:30:00に更新されます。

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

このデータをCDIが期待する形式に変換するには、次のクエリを実行します:

1
2
3
4
5
6
7
8
9
10
11
12
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_IDPAYLOAD列から分離する

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

属性を削除する

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

増分更新を行う

同時更新による意図しない上書きを防ぐため、データに増分更新を行ってください。

この動作を防ぐ最善の方法は、CDI同期のソースデータが各ユーザーの最新の状態のみを反映するようにするか、特定のユーザーまたはユーザー+属性ペアのすべての更新を単一の行に含めることです。

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

各属性を個別の列に内部的に保存する場合は、Brazeとの同期を設定するために、それらの列をJSON文字列に変換する必要があります。これを行うには、次のようなクエリを使用できます。

Snowflakeでこのクエリを使用して、ソース列をCDIフィールドにフォーマットします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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";

Redshiftでこのクエリを使用して、ソース列をCDIフィールドにフォーマットします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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,
    JSON_SERIALIZE(
        OBJECT (
            'attribute_1',
            attribute_1,
            'attribute_2',
            attribute_2,
            'yet_another_attribute',
            attribute_3)
    ) as PAYLOAD FROM "EXAMPLE_USER_DATA";

BigQueryでこのクエリを使用して、ソース列をCDIフィールドにフォーマットします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE OR REPLACE TABLE BRAZE.EXAMPLE_USER_DATA (attribute_1 string,
     attribute_2 STRING,
     attribute_3 NUMERIC,
     my_user_id STRING);

SELECT
    CURRENT_TIMESTAMP as UPDATED_AT,
    my_user_id as EXTERNAL_ID,
    TO_JSON(
      STRUCT(
        'attribute_1' AS attribute_1,
        'attribute_2'AS attribute_2,
        'yet_another_attribute'AS attribute_3
      )
    ) as PAYLOAD
  FROM BRAZE.EXAMPLE_USER_DATA;

Databricksでこのクエリを使用して、ソース列をCDIフィールドにフォーマットします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE OR REPLACE TABLE BRAZE.EXAMPLE_USER_DATA (
    attribute_1 string,
    attribute_2 STRING,
    attribute_3 NUMERIC,
    my_user_id STRING
);

SELECT
    CURRENT_TIMESTAMP as UPDATED_AT,
    my_user_id as EXTERNAL_ID,
    TO_JSON(
      STRUCT(
        attribute_1,
        attribute_2,
        attribute_3
      )
    ) as PAYLOAD
  FROM BRAZE.EXAMPLE_USER_DATA;

Microsoft Fabricでこのクエリを使用して、ソース列をCDIフィールドにフォーマットします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE [braze].[users] (
    attribute_1 VARCHAR,
    attribute_2 VARCHAR,
    attribute_3 VARCHAR,
    attribute_4 VARCHAR,
    user_id VARCHAR
)
GO

CREATE VIEW [braze].[user_update_example]
AS SELECT
    user_id as EXTERNAL_ID,
    CURRENT_TIMESTAMP as UPDATED_AT,
    JSON_OBJECT('attribute_1':attribute_1, 'attribute_2':attribute_2, 'attribute_3':attribute_3, 'attribute_4':attribute_4) as PAYLOAD

FROM [braze].[users] ;

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

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

テーブルの設定

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

データのフォーマット

クラウドデータ取り込みのテーブル設定要件とペイロードのフォーマット要件は、クラウドデータ取り込みのテーブル設定に記載されています。

このページでは以下を区別できます。

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

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

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

製品の制限事項

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



New Stuff!