사용자 제공 데이터 매칭

사용자 제공 데이터 매칭 (UPDM)은 웹사이트, 앱, 오프라인 상점의 정보와 같이 사용자에 관해 수집한 퍼스트 파티 데이터를 Google 소유 및 운영 데이터를 포함한 모든 Google 광고 데이터에 있는 동일한 사용자의 로그인 활동과 결합합니다. 여기에는 Google Marketing Platform(GMP) 제품을 통해 구매한 데이터(예: Display & Video 360을 사용하여 구매한 YouTube)가 포함됩니다. Google 소유 및 운영이 아닌 다른 GMP 제품은 지원되지 않습니다.

사용자 제공 데이터 매칭에 사용하려면 광고 이벤트를 Google 광고 데이터에서 로그인한 사용자와 연결해야 합니다.

이 문서에서는 사용자 제공 데이터 매칭 기능을 설명하고 설정 및 사용에 관한 안내를 제공합니다.

프라이빗 클라우드 데이터 이동 개요

가치 있는 광고 통계를 얻으려면 여러 소스의 데이터를 결합해야 하는 경우가 많습니다. 이 데이터 파이프라인 문제에 대한 자체 솔루션을 빌드하려면 상당한 시간과 엔지니어링 투자가 필요합니다. Ads Data Hub의 프라이빗 클라우드 Match는 BigQuery에서 일치 표를 만들기 위한 Ads Data Hub 쿼리 템플릿을 제공하여 이 프로세스를 간소화합니다. 이 일치 표는 Ads Data Hub 쿼리에서 광고 데이터를 퍼스트 파티 데이터와 일치시키는 데 사용할 수 있습니다. 퍼스트 파티 데이터로 쿼리를 보강하면 더욱 풍부한 고객 경험을 제공할 수 있고 업계 전반의 광고 추적 변화에 더 잘 대처할 수 있습니다.

로그인한 사용자의 경우 Google이 소유하고 운영하는 인벤토리에서만 사용자 제공 데이터 매칭을 사용할 수 있으므로 향후 서드 파티 쿠키의 지원 중단으로 인한 영향을 받지 않습니다. 서드 파티 데이터보다 업계 변화에 대한 저항력이 더 강하므로 더 풍부한 인사이트를 제공하여 고객 참여도를 높일 수 있습니다.

프로세스 요약

  1. 데이터 수집 및 일치 설정
    • 사용자: 퍼스트 파티 데이터가 BigQuery에 있고 서비스 계정에 읽기 액세스 권한이 있는지 확인합니다. 데이터 수집 설정을 참조하세요.
  2. 퍼스트 파티 데이터 수집 및 매칭
    • 광고주는 퍼스트 파티 데이터의 형식을 지정하고 BigQuery 데이터 세트에 업로드합니다.
    • 사용자가프라이빗 클라우드 Match 분석 쿼리 를 만들고 일정을 설정하여 데이터 일치 요청을 시작합니다.
    • Google은 프로젝트와 Google 소유 데이터 간의 데이터를 조인합니다. 이 데이터에는 Google의 사용자 ID와 해싱된 사용자 제공 데이터가 포함되어 있으며, 이를 통해 일치 테이블을 빌드하고 업데이트합니다.
    • 퍼스트 파티 데이터 수집을 참고하세요.
  3. 일치 데이터를 기반으로 Ads Data Hub에서 진행 중인 쿼리
    • Ads Data Hub에서 일반 쿼리를 실행하는 것과 동일한 방식으로 데이터 이동 색인에 대해 쿼리를 실행할 수 있습니다. 일치하는 데이터 쿼리를 참조하세요.

개인 정보 보호 요건 알아보기

고객 데이터 수집

사용자 제공 데이터 매칭을 사용할 때는 퍼스트 파티 데이터를 업로드해야 합니다. 이러한 정보에는 광고주의 웹사이트, 앱, 오프라인 상점에서 수집한 정보 또는 고객이 광고주와 직접 공유한 정보가 포함됩니다.

상담사는 다음 작업을 수행해야 합니다.

  • 개인정보처리방침에 광고주를 대신해서 서비스를 수행하는 서드 파티와 고객 데이터를 공유함을 명시하고, 현지 법규에 따라 필요한 경우 이러한 공유에 대해 동의를 구해야 합니다.
  • 고객 데이터 업로드 시 Google의 승인된 API 또는 인터페이스만 사용해야 합니다.
  • 적용되는 자체 규제 또는 업계 규정을 비롯한 모든 관련 법률 및 규정을 준수해야 합니다.

퍼스트 파티 동의 확인

Ads Data Hub에서 퍼스트 파티 데이터를 사용하려면 EU 사용자 동의 정책 및 Ads Data Hub 정책에 따라 EEA 최종 사용자로부터 Google과 데이터를 공유하는 데 적절한 동의를 받았음을 확인해야 합니다. 이 요건은 각 Ads Data Hub 계정에 적용되며, 새로운 퍼스트 파티 데이터를 업로드할 때마다 업데이트해야 합니다. 어느 사용자나 계정 전체를 대신하여 이를 확인할 수 있습니다.

분석 쿼리에 적용되는 것과 동일한 Google 서비스 쿼리 규칙이 UPDM 쿼리에도 적용됩니다. 예를 들어 데이터 이동 색인을 만들 때 EEA의 사용자에게 교차 서비스 쿼리를 실행할 수 없습니다.

Ads Data Hub에서 동의를 확인하는 방법은 유럽 경제 지역의 동의 요건을 참고하세요.

데이터 크기

최종 사용자 개인 정보를 보호하기 위해 사용자 제공 데이터 매칭은 데이터 크기와 관련된 다음 요구사항을 적용합니다.

  • 사용자 목록에 1,000개 이상의 레코드를 업로드해야 합니다.

데이터 수집 설정

시작하기 전에 다음 사항을 확인하세요.

  • 퍼스트 파티 데이터가 BigQuery에 있어야 합니다. VPC-SC 경계가 있는 경우 이 퍼스트 파티 데이터는 VPC-SC 내에 있어야 합니다.
  • Ads Data Hub 서비스 계정에 퍼스트 파티 데이터에 대한 읽기 액세스 권한이 있어야 합니다.
  • 퍼스트 파티 데이터의 형식이 올바르게 지정되고 해싱되어야 합니다. 자세한 내용은 다음 섹션을 참고하세요.

그 외에 Private Cloud Match에는 추가 온보딩이 없습니다. 분석 쿼리를 실행할 수 있으면 Private Cloud Match 쿼리를 실행할 수 있습니다.

퍼스트 파티 데이터 수집 및 일치

소스 권한 및 연결 요구사항

Ads Data Hub 연결은 설정 > 세부정보 > 서비스 계정에 표시된 서비스 계정 (일반적으로 service-<number>@gcp-sa-adsdatahub.iam.gserviceaccount.com)을 사용합니다. 이 계정에 다음 역할을 부여합니다.

  • BigQuery 소스: 소스 데이터 세트 또는 테이블에 대한 roles/bigquery.dataViewer (BigQuery 데이터 뷰어)
  • Cloud Storage 소스: 소스 버킷 또는 객체에 대한 roles/storage.objectViewer (스토리지 객체 뷰어)
  • 퍼스트 파티 데이터 가져오기 대상: 테이블이 기본 데이터 세트에 없는 경우 대상 데이터 세트에 대한 roles/bigquery.dataEditor(BigQuery 데이터 편집자)

필드 및 데이터 유형 요구사항

  1. 사용자 제공 데이터 매칭 (UPDM):
    • user_id와 하나 이상의 PII 필드 (email, phone 또는 전체 주소: first_name, last_name, country, zip_code)를 매핑합니다.
    • user_id, country, zip_code: 일반 텍스트 STRING (해싱되지 않음) BigQuery 소스의 경우 이러한 열은 이미 STRING여야 합니다. 다른 유형 (예: INT64)은 연결이 생성될 때 실패합니다. 연결은 일치 테이블에서 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 연결 하나면 충분합니다.
    • 필드별 규칙은 입력 데이터 형식 지정을 참조하세요.
  2. 퍼스트 파티 데이터 가져오기:
    • UI에서 제공하는 데이터 유형(INTEGER, STRING, HASH, DOUBLE, DATE, TIMESTAMP)만 사용합니다. 다른 BigQuery 유형은 지원되지 않습니다.
    • BigQuery 소스: 매핑된 유형이 적용되지 않습니다. 각 대상 열은 소스 열의 유형을 유지합니다.
    • Cloud Storage 소스: 열은 STRING로 읽고 매핑된 유형으로 변환됩니다. 변환할 수 없는 값은 실행 실패 없이 NULL가 됩니다.
    • 각 실행은 전체 대상 테이블을 대체하며 추가하지 않습니다. 소스에 행이 없으면 대상이 비어 있게 됩니다. 소스 테이블 또는 데이터를 보관해야 하는 테이블을 대상으로 사용하지 마세요.

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)) 변환을 사용합니다.

사용자 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"))

이름

  • 공백 제거
  • 소문자로만 입력하세요.
  • 모든 접두사(예: Mrs.) Mr., Ms., 박사
  • 악센트(예: è, é, ê, ë)를 삭제하지 마세요.
  • 해싱: Base64로 인코딩된 SHA256

유효 기간: TO_BASE64(SHA256("daní"))

잘못됨: TO_BASE64(SHA256("Daní"))

성

  • 공백 제거
  • 소문자로만 입력하세요.
  • 모든 접미사(예: Jr., 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")
  }

자바

  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`;

통합 키

사용자 제공 데이터의 일부 조합은 다른 조합보다 더 강력합니다. 다음은 상대적 강도에 따라 순위가 매겨진 다양한 사용자 제공 데이터 조합의 목록입니다. 주소를 사용하는 경우 이름, 성, 국가, 우편번호를 포함해야 합니다.

  1. 이메일, 전화번호, 주소 (가장 강력함)
  2. 전화번호, 주소
  3. 이메일, 주소
  4. 이메일, 전화
  5. 주소
  6. 전화
  7. 이메일 (가장 약함)

일치 테이블 만들기

  1. add 만들기 > 보고서를 클릭합니다.
  2. 프라이빗 클라우드 데이터 이동 색인 생성 템플릿을 선택합니다. 선택사항: 데이터가 아직 해싱되지 않은 경우 프라이빗 클라우드 데이터 이동 색인 생성 (해싱 포함)을 선택할 수 있습니다.
  3. 쿼리 수정을 클릭한 후 매개변수 이름을 열 이름으로 바꿔 적절한 별칭을 제공합니다.
  4. 일정 설정을 클릭하여 일치 테이블을 새로고침할 빈도를 설정합니다. 실행할 때마다 현재 일치 테이블을 덮어씁니다.

기존 연결 이전

연결 탭의 기존 연결은 Ads Data Hub에 직접 빌드된 업데이트된 연결 환경으로 이동합니다. 업데이트된 연결은 기존 Data Fusion, Dataproc, UPDM 서비스 계정 대신 설정 > 세부정보 > 서비스 계정 (일반적으로 service-<number>@gcp-sa-adsdatahub.iam.gserviceaccount.com)에 표시된 서비스 계정을 사용하여 소스를 읽고 대상을 작성합니다.

연결이 이전되기 전에 다음 작업 항목을 완료하세요.

  1. 서비스 계정 권한 부여: 설정 > 세부정보 > 서비스 계정 (일반적으로 service-<number>@gcp-sa-adsdatahub.iam.gserviceaccount.com)에 표시된 서비스 계정에 필요한 소스 및 대상 역할(roles/bigquery.dataViewer, roles/storage.objectViewer, 기본값이 아닌 대상 데이터 세트의 roles/bigquery.dataEditor)을 부여합니다. 읽을 수 없거나 삭제되거나 변경된 소스가 있는 연결은 계속 이동할 수 있지만(특히 이동 시 검증되지 않는 Cloud Storage 소스) 액세스 권한을 부여하거나 소스를 수정할 때까지 실행이 실패합니다.
  2. 지원되지 않는 연결 변환: 다음 구성이 있는 연결은 마이그레이션되지 않습니다. 지원되는 BigQuery 또는 Cloud Storage 연결로 변환합니다.
    • 기타 데이터 소스 (Amazon S3, Snowflake, MySQL, PostgreSQL, Amazon Redshift, sFTP, Salesforce): 먼저 BigQuery 또는 Cloud Storage에서 데이터를 스테이징한 후 BigQuery 또는 Cloud Storage 연결을 만듭니다.
    • 지원되지 않는 필드 매핑 또는 데이터 유형: 필드 및 데이터 유형 요구사항을 충족하도록 연결을 업데이트하거나 다시 만듭니다.
    • Cloud Storage 와일드 카드 경로 (* 또는 ?): 와일드 카드 URI를 단일 파일 URI로 바꾸거나 파일을 먼저 BigQuery에 로드합니다.
    • 중복 연결 이름: 계정의 각 연결에 고유한 이름이 있도록 중복 연결의 이름을 바꾸거나 삭제합니다.
  3. 사용하지 않는 연결 삭제: 더 이상 필요하지 않은 오래된 연결을 삭제합니다.

일치하는 데이터 쿼리

데이터 이동 색인 쿼리

데이터 이동 색인에 개인 정보 보호 검사를 충족하기에 충분한 데이터가 포함되어 있으면 테이블에 대해 쿼리를 실행할 수 있습니다.

퍼스트 파티 데이터 (1PD)의 원본 테이블은 my_data로 표시됩니다. 여기에는 개인 식별 정보 (PII)와 개인 식별이 불가능한 정보가 모두 포함됩니다. 원본 테이블을 사용하면 데이터 이동 색인과 비교할 때 범위 내의 모든 퍼스트 파티 데이터를 나타내므로 더 많은 통계로 보고서를 개선할 수 있습니다.

user_id 필드가 포함된 Ads Data Hub 스키마의 각 테이블에 데이터 매칭 테이블이 함께 제공됩니다. 예를 들어 adh.google_ads_impressions 테이블의 경우 Ads Data Hub는 사용자 ID가 포함된 adh.google_ads_impressions_updm라는 데이터 이동 색인도 생성합니다. 정책에 따라 격리된 네트워크 테이블의 경우 별도의 데이터 이동 색인이 생성됩니다. 예를 들어 adh.google_ads_impressions_policy_isolated_network 테이블의 경우 Ads Data Hub는 사용자 ID가 포함된 adh.google_ads_impressions_policy_isolated_network_updm라는 데이터 이동 색인도 생성합니다.

이러한 테이블에는 user_id에 일치하는 항목이 있는 원본 테이블에서 사용 가능한 사용자의 하위 집합이 포함됩니다. 예를 들어 원본 테이블에 사용자 A와 사용자 B의 데이터가 포함되어 있지만 사용자 A만 일치하는 경우 사용자 B는 데이터 이동 색인에 포함되지 않습니다.

데이터 이동 색인에는 사용자 식별자를 BYTES로 저장하는 customer_data_user_id라는 추가 열이 포함됩니다.

쿼리를 작성할 때 필드 유형을 고려해야 합니다. SQL 비교 연산자는 동일한 유형의 리터럴을 비교한다고 예상합니다. user_id가 퍼스트 파티 데이터 테이블에 저장되는 방식에 따라 데이터를 일치시키기 전에 테이블의 값을 인코딩해야 할 수도 있습니다. 매칭에 성공하려면 조인 키를 BYTES로 변환해야 합니다.

JOIN ON
  adh.google_ads_impressions_updm.customer_data_user_id = CAST(my_data.user_id AS BYTES)

또한 SQL의 문자열 비교에서는 대소문자가 구분되므로 정확하게 비교할 수 있도록 양쪽의 문자열을 인코딩해야 할 수도 있습니다.

샘플 쿼리

일치하는 사용자 수

이 쿼리는 Google Ads 노출수 표에서 일치하는 사용자 수를 계산합니다.

/* 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 FAQ

UPDM과 관련된 FAQ 목록은 UPDM FAQ를 참고하세요.