ユーザー提供データ マッチング(UPDM)では、収集したユーザーに関するファーストパーティ データ(ウェブサイト、アプリ、実店舗からの情報など)と、Google が所有および運営するデータを含むすべての Google 広告データ上におけるそのユーザーのログイン中のアクティビティ データが結合されます。これには、Google マーケティング プラットフォーム(GMP)サービスを通じて購入されたデータ(ディスプレイ&ビデオ 360 を使用して購入された YouTube など)が含まれます。Google が所有、運営していないその他の GMP サービスはサポートされていません。
ユーザー提供データ マッチングの対象となるには、広告イベントは Google の広告データ上でログイン済みのユーザーと関連付けられている必要があります。
このドキュメントでは、ユーザー提供データ マッチング機能について説明し、設定と使用に関するガイダンスを提供します。
プライベート クラウド マッチの概要
価値のある広告分析情報を得るには、多くの場合、複数のソースのデータを結合する必要があります。このデータ パイプラインの問題に対する独自のソリューションを構築するには、多大な時間とエンジニアリングの投資が必要です。Ads Data Hub のプライベート クラウド マッチでは、BigQuery でマッチテーブルを作成するための Ads Data Hub クエリ テンプレートが提供されるため、このプロセスを効率化できます。このテーブルは、Ads Data Hub クエリで広告データとファーストパーティ データを照合するために使用できます。ファーストパーティ データを使ってクエリを拡充すると、カスタマー エクスペリエンスが豊かになり、広告業界における広告のトラッキング手法の変化にも対応しやすくなります。
ユーザー提供データ マッチングは、Google が所有および運営する広告枠でのみログイン中のユーザーが利用可能なため、今後のサードパーティ Cookie のサポート終了による影響を受けません。サードパーティ データよりも業界の変化に対応できるため、より豊富な分析情報を提供でき、顧客エンゲージメントの向上につながります。
プロセスの概要
- データの取り込みとマッチングの設定
- お客様: ファーストパーティ データが BigQuery にあり、サービス アカウントに読み取りアクセス権があることを確認します。データの取り込みを設定するをご覧ください。
- ファーストパーティ データの取り込みとマッチング
- お客様がファーストパーティ データをフォーマットして BigQuery データセットにアップロードします。
- プライベート クラウド Match 分析クエリ を作成し、スケジュールを設定することで、データ マッチング リクエストを開始します。
- Google は、プロジェクトのデータと、Google のユーザー ID およびハッシュ化されたユーザー提供データを含む Google 所有のデータを結合して、マッチテーブルを作成、更新します。
- ファーストパーティ データを取り込むをご覧ください。
- 一致したデータに基づく、Ads Data Hub での継続的なクエリ
- Ads Data Hub で通常のクエリを実行するのと同じ方法で、マッチテーブルに対してクエリを実行します。一致したデータをクエリするをご覧ください。
プライバシー要件の詳細
顧客データを収集する
ユーザー提供データ マッチングを使用する場合は、ファーストパーティ データをアップロードする必要があります。これには、ウェブサイト、アプリ、実店舗から収集した情報や、顧客が直接共有した情報が含まれます。
以下を行ってください:
- プライバシー ポリシーで、広告主様に代わってサービスを提供する第三者と顧客データを共有していることを開示すること、また、法的要件がある場合はそのような共有について同意を得るようにしてください。
- 顧客データをアップロードする際には、Google が承認する API かインターフェースのみを使用すること
- 該当するすべての法令(自主規制によるガイドラインまたは業界が定めるガイドラインを含む)に準拠すること
ファーストパーティによる同意取得の確認
Ads Data Hub でファーストパーティ データを使用するには、EU ユーザーの同意ポリシーと Ads Data Hub ポリシーに則って、Google へのデータ共有に対する EEA のエンドユーザーによる適切な同意を取得していることを確認する必要があります。同意取得の確認は、Ads Data Hub アカウントごとに、新しいファーストパーティ データをアップロードするたびに行う必要があります。1 人のユーザーがアカウント全体を代表してこの確認を行うことができます。
分析クエリに適用される同じ Google サービス クエリルールが UPDM クエリにも適用されます。たとえば、マッチテーブルを作成する際、EEA 内のユーザーに対してサービス間クエリを実行することはできません。
Ads Data Hub で同意獲得を確認する方法については、欧州経済領域の同意に関する要件をご覧ください。
データサイズ
エンドユーザーのプライバシーを保護するため、ユーザー提供データ マッチングでは、データのサイズに関して次の要件が適用されます。
- ユーザーリストには 1,000 件以上のレコードをアップロードする必要があります。
データの取り込みを設定する
開始する前に、次のことを確認してください。
- ファーストパーティ データは BigQuery に保存されている必要があります。VPC-SC 境界がある場合、このファーストパーティ データは VPC-SC 内に配置する必要があります。
- Ads Data Hub サービス アカウントには、ファーストパーティ データへの読み取りアクセス権が必要です。
- ファーストパーティ データは、正しい形式でハッシュ化する必要があります。詳しくは、次のセクションをご覧ください。
それ以外に、プライベート クラウド マッチングに追加のオンボーディングはありません。分析クエリを実行できる場合は、プライベート クラウド マッチ クエリを実行できます。
ファーストパーティ データを取り込んで照合する
ソースの権限と接続の要件
Ads Data Hub Connections は、[設定] > [詳細] > [サービス アカウント] に表示されるサービス アカウント(通常は service-<number>@gcp-sa-adsdatahub.iam.gserviceaccount.com)を使用します。このアカウントに次のロールを付与します。
- BigQuery ソース: ソース データセットまたはテーブルに対する
roles/bigquery.dataViewer(BigQuery データ閲覧者)。 - Cloud Storage ソース: ソースバケットまたはオブジェクトに対する
roles/storage.objectViewer(Storage オブジェクト閲覧者)。 - ファーストパーティ データのインポート先: テーブルがデフォルトのデータセットにない場合は、宛先データセットに対する
roles/bigquery.dataEditor(BigQuery データ編集者)。
フィールドとデータ型の要件
- ユーザー提供データ マッチング(UPDM):
user_idと少なくとも 1 つの PII フィールド(email、phone、または完全な住所:first_name、last_name、country、zip_code)をマッピングします。user_id、country、zip_code: 書式なしテキストのSTRING(ハッシュ化されていない)。BigQuery ソースの場合、これらの列はすでにSTRINGである必要があります。他の型(INT64など)は、接続の作成時に失敗します。Connections は、マッチテーブルでuser_idをBYTESにキャストします。countryは、2 文字の ISO 3166-1 alpha-2 コードにする必要があります。email、phone、first_name、last_name:HASH- SHA-256 ハッシュ化と Base64 エンコードがすでに完了している必要があります(64 文字の 16 進数 SHA-256 値も使用できます)。Connections はデータをハッシュ化しません。接続の作成時に書式なしテキストの値がキャッチされず、すべての実行が... must be encoded using TO_BASE64(SHA256(...))で失敗します。- ユーザー提供データ マッチングの接続には、宛先テーブルがありません。アカウント内のすべてのクエリと、手動で実行される UPDM クエリは、同じ一致データに書き込まれるため、実行するたびに前のデータが置き換えられます。UPDM 接続はアカウントごとに 1 つで十分です。
- フィールドごとのルールについては、入力用のデータをフォーマットするをご覧ください。
- ファーストパーティ データのインポート:
- UI で提供されるデータ型(
INTEGER、STRING、HASH、DOUBLE、DATE、TIMESTAMP)のみを使用します。他の BigQuery 型はサポートされていません。 - BigQuery ソース: マッピングされた型は適用されません。各宛先列はソース列の型を保持します。
- Cloud Storage ソース: 列は
STRINGとして読み取られ、マッピングされた型にキャストされます。キャストできない値は、実行を失敗させることなくNULLになります。 - 各実行では、宛先テーブル全体が置き換えられます。追加はされません。ソースに行がない場合、宛先は空になります。ソーステーブルや、データを保持する必要があるテーブルを宛先として使用しないでください。
- UI で提供されるデータ型(
Cloud Storage CSV の列の要件
- ヘッダー行を含めます。最初の行はスキップされます。列名は使用されません。
- ファイルには、マッピングされたソース列のみが含まれている必要があります。余分な列があると、実行が失敗します。
- ファーストパーティ データのインポート: 列はフィールド マッピングと同じ順序にする必要があります。
- ユーザー提供データ マッチング: 列は、マッピングするフィールドのみを保持し、
user_id、email、phone、first_name、last_name、country、zip_codeの順に並べる必要があります。マッピング行の順序は関係ありません。 - 列の順序が異なることは検出されません。値はエラーなしで間違ったフィールドに読み込まれます(またはマッチ率が低下します)。
サポートされているデータソースと接続の上限
- データソース: BigQuery と Cloud Storage のソースのみがサポートされています。
- BigQuery テーブル名: ソースと宛先の BigQuery テーブルには、完全な
project.dataset.table名が必要です。 - Cloud Storage ファイルパス: 単一のファイル URI(
gs://bucket/path/file.csvなど)を指定します。*または?を含むワイルドカード パスはサポートされていません。 - 接続名: アカウント内の各接続には一意の名前を付ける必要があります。
入力用にデータをフォーマットする
データが正しく照合されるようにするには、次の形式要件に準拠する必要があります。
- 以下の入力フィールドの説明に記載されている場合は、SHA256 ハッシュを使用してアップロードする必要があります。
- UPDM は Base64 エンコードをサポートしています。TO_BASE64 をご覧ください。
- 入力フィールドは文字列としてフォーマットする必要があります。たとえば、BigQuery の SHA256 ハッシュ関数を使用している場合は、
TO_BASE64(SHA256(user_data))変換を使用します。
User ID
- データ型:
BYTES - ハッシュ化: なし
メール
- 先頭と末尾の空白文字を削除する
- 文字はすべて小文字にしてください
- すべてのメールアドレスにドメイン名(gmail.com や hotmail.co.jp など)を含めてください
- アクセント記号を削除する(例: è、é、ê、ë を e に変更する)
gmail.comとgooglemail.comのメールアドレスのドメイン名の前にあるすべてのピリオド(.)を削除する。- ハッシュ化: Base64 でエンコードされた SHA256
有効期間: TO_BASE64(SHA256("jeffersonloveshiking@gmail.com"))
無効: TO_BASE64(SHA256("JéffersonLôvesHiking@gmail.com"))
電話
- 空白文字を削除する
- E.164 形式にする(例: 米国の場合 +14155552671、英国の場合 +442071838750)
- 特殊記号はすべて削除する(ただし、国コードの直前の “+” はそのままにする)
- ハッシュ化: Base64 でエンコードされた SHA256
有効期間: TO_BASE64(SHA256("+18005550101"))
無効: TO_BASE64(SHA256("(800) 555-0101"))
名
- 空白文字を削除する
- 文字はすべて小文字にしてください
- 姓名の前後につく称号や肩書様、様、博士
- アクセント記号(è、é、ê、ë など)を削除しない
- ハッシュ化: Base64 でエンコードされた SHA256
有効期間: TO_BASE64(SHA256("daní"))
無効: TO_BASE64(SHA256("Daní"))
姓
- 空白文字を削除する
- 文字はすべて小文字にしてください
- 姓名の前後につく称号や肩書Sr., 2nd、3rd、II、III、PHD、MD
- アクセント記号(è、é、ê、ë など)を削除しない
- ハッシュ化: Base64 でエンコードされた SHA256
有効期間: TO_BASE64(SHA256("délacruz"))
無効: TO_BASE64(SHA256("dé la Cruz, Jr."))
国
- 顧客データがすべて同じ国のものである場合も、国コードを含めてください
- 国データはハッシュ化しないでください。
- ISO 3166-1 alpha-2 形式の国コードを使用します。
- ハッシュ化: なし
有効期間: US
無効: United States of America または USA
郵便番号
- 郵便番号のデータはハッシュ化しないでください。
- 米国の郵便番号と国際郵便番号の両方を使用できます
- 米国の場合:
- 5 桁の郵便番号を指定できます(例: 94043)。
- 5 桁の後に 4 桁の拡張コードが続く形式も使用できます(例: 94043-1351、940431351)。
- その他の国の場合:
- 書式設定は不要(小文字への変換、スペースや特殊文字の削除は不要)
- 郵便番号の拡張コード部分は省略してください
- ハッシュ化: なし
ハッシュ検証とデータ エンコード
次のハッシュ検証スクリプトを使用して、データが正しくフォーマットされていることを確認できます。
JavaScript
/**
* @fileoverview Provides the hashing algorithm, as well as some valid hashes of
* sample data for testing.
*/
async function hash(token) {
// Removes leading or trailing spaces and converts all characters to lowercase.
const formattedToken = token.trim().toLowerCase();
// Hashes the formatted string using the SHA-256 hashing algorithm.
const hashBuffer = await crypto.subtle.digest(
'SHA-256', (new TextEncoder()).encode(formattedToken));
// Converts the hash buffer to a base64-encoded string and returns it.
const base64Str = btoa(String.fromCharCode(...new Uint8Array(hashBuffer)));
return base64Str;
}
function main() {
// Expected hash for test@gmail.com:
// h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
hash('test@gmail.com').then(result => console.log(result));
// Expected hash for +18005551212:
// YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
hash('+18005551212').then(result => console.log(result));
// Expected hash for John: ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
hash('John').then(result => console.log(result));
// Expected hash for Doe: eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=
hash('Doe').then(result => console.log(result));
}
main()
Python
"""Provides the hashing algorithm, as well as some valid hashes of sample data for testing.
Supports: Python 2, Python 3
Sample hashes:
- Email 'test@gmail.com': h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
- Phone '+18005551212': YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
- First name 'John': ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
- Last name 'Doe': eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=
"""
import base64
import hashlib
def hash(token):
# Generates a base64-encoded SHA-256 hash of a normalized input string.
return base64.b64encode(
hashlib.sha256(
token.strip().lower().encode('utf-8')).digest()).decode('utf-8')
def print_hash(token, expected=None):
# Computes and displays the hash of a token, with optional validation.
hashed = hash(token)
if expected is not None and hashed != expected:
print(
'ERROR: Incorrect hash for token "{}". Expected "{}", got "{}"'.format(
token, expected, hashed))
return
print('Hash: "{}"\t(Token: {})'.format(hashed, token))
def main():
# Tests the hash function with sample tokens and expected results.
print_hash(
'test@gmail.com', expected='h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=')
print_hash(
'+18005551212', expected='YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=')
print_hash('John', expected='ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=')
print_hash('Doe', expected='eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=')
if __name__ == '__main__':
main()
Go
/*
Provides the hashing algorithm, as well as some valid hashes of sample data for testing.
Sample hashes:
- Email 'test@gmail.com': h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
- Phone '+18005551212': YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
- First name 'John': ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
- Last name 'Doe': eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=
*/
package main
import (
"crypto/sha256"
"encoding/base64"
"fmt"
"strings"
)
// Hash hashes an email, phone, first name, or last name into the correct format.
func Hash(token string) string {
formatted := strings.TrimSpace(strings.ToLower(token))
hashed := sha256.Sum256([]byte(formatted))
encoded := base64.StdEncoding.EncodeToString(hashed[:])
return encoded
}
// PrintHash prints the hash for a token.
func PrintHash(token string) {
fmt.Printf("Hash: \"%s\"\t(Token: %s)\n", Hash(token), token)
}
func main() {
PrintHash("test@gmail.com")
PrintHash("+18005551212")
PrintHash("John")
PrintHash("Doe")
}
Java
package updm.hashing;
import static java.nio.charset.StandardCharsets.UTF_8;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
/**
* Example of the hashing algorithm.
*
* <p>Sample hashes:
*
* <ul>
* <li>Email 'test@gmail.com': h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
* <li>Phone '+18005551212': YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
* <li>First name 'John': ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
* <li>Last name 'Doe': eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=
* </ul>
*/
public final class HashExample {
private HashExample() {}
public static String hash(String token) {
// Normalizes and hashes the input token using SHA-256 and Base64 encoding.
String formattedToken = token.toLowerCase().strip();
byte[] hash;
try {
hash = MessageDigest.getInstance("SHA-256").digest(formattedToken.getBytes(UTF_8));
} catch (NoSuchAlgorithmException e) {
throw new IllegalStateException("SHA-256 not supported", e);
}
return Base64.getEncoder().encodeToString(hash);
}
public static void printHash(String token) {
// Calculates and prints the hash for the given token.
System.out.printf("Hash: \"%s\"\t(Token: %s)\n", hash(token), token);
}
public static void main(String[] args) {
// Executes hash calculations and prints results for sample tokens.
printHash("test@gmail.com");
printHash("+18005551212");
printHash("John");
printHash("Doe");
}
}
SQL
/*
Provides the hashing algorithm, as well as some valid hashes of sample data for testing.
The following code uses Google Standard SQL and can be run on BigQuery to generate match tables from unhashed data.
Sample hashes:
- Email 'test@gmail.com': h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
- Phone '+18005551212': YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
- First name 'John': ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
- Last name 'Doe': eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=
The unhashed input table schema is assumed to be:
- Column name: UserID, Type: String
- Column name: Email, Type: String
- Column name: Phone, Type: String
- Column name: FirstName, Type: String
- Column name: LastName, Type: String
- Column name: PostalCode, Type: String
- Column name: CountryCode, Type: String
*/
-- Creates a new table with Base64-encoded SHA-256 hashes of specified columns.
CREATE TABLE `your_project_name.your_dataset_name.output_hashed_table_name`
AS
SELECT
UserID,
TO_BASE64(SHA256(LOWER(Email))) AS Email,
TO_BASE64(SHA256(Phone)) AS Phone,
TO_BASE64(SHA256(LOWER(FirstName))) AS FirstName,
TO_BASE64(SHA256(LOWER(LastName))) AS LastName,
PostalCode,
CountryCode,
FROM
`your_project_name.your_dataset_name.input_unhashed_table_name`;
統合キー
ユーザー提供データの組み合わせによっては、より効果的なものもあります。以下は、ユーザー提供データのさまざまな組み合わせを、相対的な強さでランク付けしたリストです。住所を使用する場合は、名、姓、国、郵便番号を含める必要があります。
- メールアドレス、電話番号、住所(最も強力)
- 電話番号、住所
- メールアドレス
- メールアドレス、電話番号
- 住所
- 電話
- メール(最も弱い)
マッチテーブルを作成する
- [add 作成] > [レポート] をクリックします。
- [プライベート クラウドのマッチテーブルの生成] テンプレートを選択します。省略可: データがまだハッシュ化されていない場合は、[プライベート クラウドのマッチテーブルの生成(ハッシュ化)] を選択できます。
- [クエリを編集] をクリックし、パラメータ名を列名に置き換えて、適切なエイリアスを指定します。
- [スケジュールを設定] をクリックして、マッチテーブルを更新する頻度を設定します。実行するたびに、現在のマッチテーブルが上書きされます。
既存の接続を移行する
[接続] タブの既存の接続は、Ads Data Hub に直接組み込まれた、更新された接続エクスペリエンスに移行されます。更新された接続は、以前の Data Fusion、Dataproc、UPDM のサービス アカウントではなく、[設定] > [詳細] > [サービス アカウント](通常は service-<number>@gcp-sa-adsdatahub.iam.gserviceaccount.com)に表示されるサービス アカウントを使用して、読み取りソースと書き込み先を読み取ります。
接続が移行される前に、次のアクション アイテムを完了してください。
- サービス アカウントの権限を付与する: [設定] > [詳細] > [サービス アカウント] に表示されるサービス アカウント(通常は
service-<number>@gcp-sa-adsdatahub.iam.gserviceaccount.com)に、必要なソースロールと宛先ロール(デフォルト以外の宛先データセットに対するroles/bigquery.dataViewer、roles/storage.objectViewer、roles/bigquery.dataEditor)を付与します。読み取り不能、削除済み、または変更済みのソースとの接続は、移動される可能性があります(特に、移動時に検証されない Cloud Storage ソース)。ただし、アクセス権を付与するか、ソースを修正するまで、実行は失敗します。 - サポートされていない接続を変換する: 次の構成の接続は移行されません。サポートされている BigQuery または Cloud Storage 接続に変換します。
- その他のデータソース(Amazon S3、Snowflake、MySQL、PostgreSQL、Amazon Redshift、sFTP、Salesforce): 最初に BigQuery または Cloud Storage にデータをステージングしてから、BigQuery または Cloud Storage 接続を作成します。
- サポートされていないフィールド マッピングまたはデータ型: フィールドとデータ型の要件を満たすように接続を更新または再作成します。
- Cloud Storage のワイルドカード パス(
*または?): ワイルドカード URI を単一ファイルの URI に置き換えるか、最初にファイルを BigQuery に読み込みます。 - 重複する接続名: 重複する接続の名前を変更するか、削除して、アカウント内の各接続に一意の名前を付けます。
- 未使用の接続を削除する: 不要になった古い接続を削除します。
一致したデータをクエリする
マッチテーブルでのクエリ実行
マッチテーブルにプライバシー チェックの発動に十分なデータが蓄積されている場合は、テーブルでクエリを実行できます。
ファーストパーティ データ(1PD)の元のテーブルは my_data で表されます。これには、個人を特定できる情報(PII)と個人を特定できない情報の両方が含まれます。元のテーブルを使用すると、マッチテーブルと比較して、スコープ内のすべてのファースト パーティ データが表されるため、より多くの分析情報でレポートを改善できます。
Ads Data Hub スキーマ内で user_id フィールドを含むテーブルは、それぞれ対応するマッチテーブルを持ちます。たとえば adh.google_ads_impressions テーブルに対しては Ads Data Hub によって adh.google_ads_impressions_updm というマッチテーブルが自動的に生成され、後者にはユーザー ID が含まれています。ポリシー分離ネットワーク テーブル用に個別のマッチテーブルが作成されます。たとえば adh.google_ads_impressions_policy_isolated_network テーブルに対しては adh.google_ads_impressions_policy_isolated_network_updm というマッチテーブルが自動的に生成され、後者にはユーザー ID が含まれています。
生成されたテーブルには、元のテーブルのユーザーの中から、user_id によるマッチがあったものだけを抽出したサブセットが格納されています。たとえば、元のテーブルにユーザー A とユーザー B のデータが含まれていて、ユーザー A のみにマッチがある場合、ユーザー B はマッチテーブルに格納されません。
マッチテーブルには customer_data_user_id という列があり、ユーザー識別子がバイト型で保存されます。
クエリを記述する際は、フィールドのデータ型を考慮することが重要です。SQL の比較演算子では、比較するリテラル同士は同じデータ型であることを期待されます。自社データのテーブルの user_id の格納方法によっては、データをマッチングする前に、テーブル内の値のエンコードが必要となることもあります。マッチングを成功させるには、結合キーをバイトに型変換する必要があります。
JOIN ON
adh.google_ads_impressions_updm.customer_data_user_id = CAST(my_data.user_id AS BYTES)
また、SQL の文字列比較では大文字と小文字が区別されます。正確な比較ができるよう、必要に応じて双方の文字列をエンコードしてください。
サンプルクエリ
一致したユーザー数をカウントする
このクエリは、Google 広告のインプレッション テーブルで一致したユーザーの数をカウントします。
/* Count matched users in Google Ads impressions table */
SELECT COUNT(DISTINCT user_id)
FROM adh.google_ads_impressions_updm
マッチ率を計算する
すべてのユーザーがマッチングの対象となるわけではありません。たとえば、ログアウトしているユーザー、子供、同意していないユーザーは、UPDM で照合されません。is_updm_eligible フィールドを使用すると、より正確な UPDM マッチ率を計算できます。is_updm_eligible フィールドは 2024 年 10 月 1 日から利用可能になりました。このフィールドを使用して、その日付より前のマッチ率を計算することはできません。
/* Calculate the UPDM match rate */
CREATE TEMP TABLE total_events OPTIONS(privacy_checked_export=TRUE) AS
SELECT
customer_id,
COUNT(*) AS n
FROM adh.google_ads_impressions
WHERE is_updm_eligible
GROUP BY 1;
CREATE TEMP TABLE matched_events OPTIONS(privacy_checked_export=TRUE) AS
SELECT
customer_id,
COUNT(*) AS n
FROM adh.google_ads_impressions_updm
GROUP BY 1;
SELECT
customer_id,
SAFE_DIVIDE(matched_events.n, total_events.n) AS match_rate
FROM total_events
LEFT JOIN matched_events
USING (customer_id)
ファーストパーティ データと Google 広告データを結合する
このクエリは、ファーストパーティ データを Google 広告データと結合する方法を示しています。
/* Join first-party data with Google Ads data. The customer_data_user_id field
contains your ID as BYTES. You need to cast your join key into BYTES for
successful matches. */
SELECT
inventory_type,
COUNT(*) AS impressions
FROM
adh.yt_reserve_impressions_updm AS google_data_imp
LEFT JOIN
`my_data`
ON
google_data_imp.customer_data_user_id = CAST(my_data.user_id AS BYTES)
GROUP BY
inventory_type
UPDM に関するよくある質問
UPDM に関するよくある質問の一覧については、UPDM に関するよくある質問をご覧ください。