Сопоставление данных, предоставленных пользователями

Функция сопоставления предоставленных пользователем данных (UPDM) объединяет собственные данные, собранные вами о пользователе — например, информацию с ваших веб-сайтов, приложений или физических магазинов — с данными об активности этого же пользователя в системе Google Ads , включая данные, принадлежащие и управляемые Google. Это включает данные, приобретенные через продукты Google Marketing Platform (GMP), например, данные YouTube, приобретенные с помощью Display & Video 360. Другие продукты GMP, не принадлежащие и не управляемые Google, не поддерживаются.

Для того чтобы сопоставить данные, предоставленные пользователем, с рекламным событием , оно должно быть связано с авторизованным пользователем в базе данных рекламы Google.

В этом документе описывается функция сопоставления данных, предоставляемых пользователем, и приводятся рекомендации по настройке и использованию.

Обзор вкладки «Подключения»

Получение ценных аналитических данных о рекламе часто требует объединения данных из множества источников. Создание собственного решения для этой задачи обработки данных требует значительных временных и инженерных затрат. Страница «Подключения» в Ads Data Hub упрощает этот процесс, предоставляя пошаговый интерфейс для импорта, преобразования и сопоставления данных о вашей рекламе в BigQuery, чтобы вы могли использовать их в запросах Ads Data Hub или любом другом продукте, который считывает данные из BigQuery. Обогащение ваших запросов данными из собственных источников может обеспечить более качественный пользовательский опыт и более устойчиво к общеотраслевым изменениям в отслеживании рекламы.

Страница «Подключения» создана с использованием инструментов, позволяющих шифровать и передавать персональные данные (PII) партнерам с соблюдением принципов конфиденциальности. После выбора столбцов, содержащих PII, Ads Data Hub шифрует данные, гарантируя, что ваши собственные данные могут быть экспортированы или прочитаны только лицами, имеющими на это разрешение. Определить, какие именно собственные данные необходимы для вашего сценария измерения или активации, может быть сложно, поэтому Ads Data Hub предоставляет исчерпывающий список предопределенных сценариев использования, а затем проводит вас через весь процесс извлечения, преобразования и загрузки ваших данных. Хотя можно создавать несколько типов подключений, в этом документе предполагается, что вы используете страницу «Подключения» для сопоставления данных, предоставленных пользователем.

Поддерживаемые собственные источники данных

Вы можете импортировать данные из следующих источников:

  • BigQuery
  • Облачное хранилище
  • Защищенный FTP (sFTP)
  • Снежинка
  • MySQL
  • PostgreSQL
  • Amazon Redshift
  • Amazon S3

Поскольку сопоставление предоставленных пользователем данных доступно только для принадлежащих Google и управляемых ими ресурсов для авторизованных пользователей, на него не повлияет предстоящее прекращение поддержки сторонних файлов cookie . Так как оно более устойчиво к изменениям в отрасли, чем данные сторонних источников, оно может предоставлять более ценную информацию, что может привести к повышению вовлеченности клиентов.

Изучите терминологию.

  • Подключение к данным, предоставленным пользователем: Настройте подключение к данным, предоставленным пользователем, для импорта и сопоставления ваших данных, планирования импорта данных, преобразования данных и сопоставления данных ваших объявлений с использованием идентификатора пользователя. Событие объявления должно быть связано с авторизованным пользователем в данных объявлений Google. Требуется несколько проектов Google Cloud.
  • Подключение к исходным данным: Настройте подключение к исходным данным в качестве инструмента подготовки данных, чтобы планировать импорт данных и преобразовывать данные без использования расширенных функций UPDM. Для такого типа подключения требуется всего один проект Google Cloud.
  • Источник данных: подключенный продукт, импортированный файл или интеграция со сторонним сервисом — например, BigQuery.
  • Назначение: Вариант использования; как правило, это продукт или функция продукта Google, в котором активируются импортированные данные — например, сопоставление данных, предоставленных пользователем, в Ads Data Hub.
  • Административный проект: проект Google Cloud, содержащий ваши личные рекламные данные в необработанном формате.
  • Выходной набор данных: набор данных BigQuery, в который Ads Data Hub записывает данные. По умолчанию это набор данных в вашем проекте администрирования. Чтобы изменить его на другой проект Google Cloud, см. раздел «Настройка учетных записей служб» .

Краткое описание процесса

  1. Настройка процесса ввода и сопоставления данных.
  2. Сбор и сопоставление данных от первого лица
    • Вы форматируете и загружаете свои собственные данные в свой набор данных BigQuery. Для простейшей настройки используйте свой административный проект . Однако вы можете использовать любой принадлежащий вам набор данных BigQuery.
    • Запрос на сопоставление данных инициируется путем создания соединения и установки расписания импорта.
    • Google объединяет данные вашего проекта с данными, принадлежащими Google и содержащими идентификатор пользователя Google, а также хешированные данные, предоставленные пользователем, для создания и обновления таблиц соответствия.
    • См. раздел «Ввод собственных данных».
  3. Текущие запросы в Центре данных рекламы, основанные на сопоставленных данных.

Узнайте о требованиях к обеспечению конфиденциальности.

Сбор данных о клиентах

При использовании сопоставления данных, предоставленных пользователем, необходимо загрузить собственные данные. Это может быть информация, собранная вами с ваших веб-сайтов, приложений, физических магазинов, или любая информация, которой клиент поделился с вами напрямую.

Вы должны:

  • Убедитесь, что ваша политика конфиденциальности раскрывает информацию о том, что вы передаете данные клиентов третьим сторонам для оказания услуг от вашего имени, и что вы получаете согласие на такую ​​передачу в случаях, когда это требуется по закону.
  • Для загрузки данных клиентов используйте только одобренные Google API или интерфейсы.
  • Соблюдайте все применимые законы и правила , включая любые нормативные акты саморегулирования или отраслевые кодексы, которые могут применяться.

Подтверждение согласия первой стороны

Чтобы обеспечить возможность использования ваших собственных данных в Ads Data Hub, вы должны подтвердить получение надлежащего согласия на передачу данных от конечных пользователей из ЕЭЗ компании Google в соответствии с политикой согласия пользователей ЕС и политикой Ads Data Hub . Это требование распространяется на каждый аккаунт Ads Data Hub и должно обновляться каждый раз при загрузке новых собственных данных. Любой пользователь может подтвердить это от имени всего аккаунта.

Обратите внимание, что те же правила запросов к сервисам Google, которые применяются к аналитическим запросам, также применяются к запросам UPDM. Например, вы не можете выполнять межсервисные запросы к пользователям в ЕЭЗ при создании таблицы соответствия.

Чтобы узнать, как подтвердить согласие в Ads Data Hub, см. раздел «Требования к согласию для Европейской экономической зоны» .

Размер данных

Для защиты конфиденциальности конечных пользователей сопоставление предоставленных пользователем данных устанавливает следующие требования к объему ваших данных:

  • Вам необходимо загрузить не менее 1000 записей в свой список пользователей.
  • Каждое успешное обновление вашей таблицы совпадений должно включать минимальное количество новых совпадающих пользователей. Это поведение аналогично проверкам различий .
  • Ваш список не должен превышать максимально допустимое количество записей. Чтобы узнать о максимальном лимите данных, обратитесь к представителю Google.

Настройка приема данных

Прежде чем начать, вам необходимо настроить свою учетную запись Ads Data Hub для создания подключений к данным, что позволит вам настроить конвейер сопоставления данных. Эти шаги нужно выполнить только один раз.

На странице «Подключения» нажмите «Начать настройку» , чтобы открыть мастер настройки учетной записи на этапе активации UPDM.

Перейдите в раздел «Подключения».

Какие права доступа предоставляются для BigQuery и Cloud Storage?

Если вы настраиваете UPDM для использования с BigQuery или Cloud Storage, воспользуйтесь этим руководством, чтобы понять, какие разрешения предоставляются учетным записям службы Ads Data Hub.

BigQuery

учетная запись службы Datafusion
Цель Учетная запись службы Datafusion используется для отображения списка полей источника в пользовательском интерфейсе Ads Data Hub.
Формат service- some-number @gcp-sa-datafusion.iam.gserviceaccount.com
Необходимый доступ
BigQuery Data Viewer
roles/bigquery.dataViewer
для конкретных наборов данных в проектах «Источник данных» и «Назначение данных»
Storage Admin
roles/storage.admin
для проекта «Источник данных» или для выделенного хранилища.
учетная запись службы Dataproc
Цель Учетная запись службы dataproc отвечает за запуск конвейеров обработки данных в фоновом режиме.
Формат some-number -compute@developer.gserviceaccount.com
Необходимый доступ
BigQuery Data Viewer
roles/bigquery.dataViewer
для конкретных наборов данных в проектах «Источник данных» и «Назначение данных»
BigQuery Data Editor
roles/bigquery.dataEditor
для конкретных наборов данных в проекте Destination
BigQuery Job User
roles/bigquery.jobUser
для проектов как источников данных , так и получателей данных .
Storage Admin
roles/storage.admin
для проектов как источника , так и получателя данных, или для выделенного хранилища.
Учетная запись службы UPDM
Цель Для запуска задачи сопоставления используется учетная запись службы UPDM.
Формат service- some-number @gcp-sa-adsdataconnector.iam.gserviceaccount.com
Необходимый доступ
BigQuery Data Viewer
roles/bigquery.dataViewer
для проекта «Место назначения»
BigQuery Job User
roles/bigquery.jobUser
для проекта «Место назначения»

Облачное хранилище

учетная запись службы Datafusion
Цель Учетная запись службы Datafusion используется для отображения списка полей источника в пользовательском интерфейсе Ads Data Hub.
Формат service- some-number @gcp-sa-datafusion.iam.gserviceaccount.com
Необходимый доступ
Storage Object Viewer
roles/storage.objectViewer
для конкретных сегментов хранения в проекте «Источник данных»
BigQuery Data Viewer
roles/bigquery.dataViewer
для проекта «Источник данных» или для выделенного хранилища.
Storage Admin
roles/storage.admin
для проекта «Источник данных» или для выделенного хранилища.
учетная запись службы Dataproc
Цель Учетная запись службы dataproc отвечает за запуск конвейеров обработки данных в фоновом режиме.
Формат some-number -compute@developer.gserviceaccount.com
Необходимый доступ
Storage Admin
roles/storage.admin
для проектов как источника , так и получателя данных, или для выделенного хранилища.
BigQuery Job User
roles/bigquery.jobUser
для проекта «Место назначения»
Учетная запись службы UPDM
Цель Для запуска задачи сопоставления используется учетная запись службы UPDM.
Формат service- some-number @gcp-sa-adsdataconnector.iam.gserviceaccount.com
Необходимый доступ
BigQuery Data Viewer
roles/bigquery.dataViewer
для проекта «Место назначения»
BigQuery Job User
roles/bigquery.jobUser
для проекта «Место назначения»

Другие источники данных

Для других источников данных это не требуется.

Загрузка и сопоставление данных из первых рук.

Форматирование данных для ввода

Для корректного сопоставления ваши данные должны соответствовать следующим требованиям к форматированию:

  • В тех случаях, когда это указано в описаниях полей ввода ниже, загрузка должна осуществляться с использованием хеширования SHA256.
  • Поля ввода должны быть отформатированы как строки. Например, если вы используете хеш-функцию SHA256 в BigQuery с функцией кодирования Base16 ( TO_HEX ), используйте следующее преобразование: TO_HEX(SHA256(user_data)) .
  • UPDM поддерживает кодирование как Base16, так и Base64. Необходимо согласовать кодирование ваших собственных данных с декодированием, используемым в запросе Ads Data Hub. Если вы измените кодирование ваших собственных данных, необходимо обновить запрос Ads Data Hub, чтобы декодирование производилось из того же базового кода. В следующих примерах используется кодирование Base16.

ID пользователя

  • Простой текст
  • Хэширование: отсутствует

Электронная почта

  • Удалите пробелы в начале и конце текста.
  • Все символы написаны строчными буквами.
  • Укажите доменное имя для всех адресов электронной почты, например, gmail.com или hotmail.co.jp.
  • Удалите диакритические знаки — например, замените è, é, ê или ë на e.
  • Удалите все точки (.) перед доменным именем в адресах электронной почты gmail.com и googlemail.com
  • Хэширование: SHA256, закодированное в Base16

Действительный код: TO_HEX(SHA256("jeffersonloveshiking@gmail.com"))

Неверный код: TO_HEX(SHA256("JéffersonLôvesHiking@gmail.com"))

Телефон

  • Удалите пробелы
  • Форматируйте в формате E.164 — например, в США: +14155552671, в Великобритании: +442071838750
  • Удалите все специальные символы, кроме знака «+», перед кодом страны.
  • Хэширование: SHA256, закодированное в Base16

Допустимое значение: TO_HEX(SHA256("+18005550101"))

Недопустимое значение: TO_HEX(SHA256("(800) 555-0101"))

Имя

  • Удалите пробелы
  • Все символы написаны строчными буквами.
  • Удалите все префиксы, например, Mrs., Mr., Ms., Dr.
  • Не удаляйте диакритические знаки — например, è, é, ê или ë.
  • Хэширование: SHA256, закодированное в Base16

Допустимо: TO_HEX(SHA256("daní"))

Неверно: TO_HEX(SHA256("Daní"))

Фамилия

  • Удалите пробелы
  • Все символы написаны строчными буквами.
  • Удалите все суффиксы, например младший, старший, 2-й, 3-й, II, III, PHD, MD.
  • Не удаляйте диакритические знаки — например, è, é, ê или ë.
  • Хэширование: SHA256, закодированное в Base16

Допустимое значение: TO_HEX(SHA256("delacruz"))

Недопустимое значение: TO_HEX(SHA256("de la Cruz, Jr."))

Страна

  • Указывайте код страны, даже если все данные о ваших клиентах относятся к одной и той же стране.
  • Не хешируйте данные о странах.
  • Используйте коды стран ISO 3166-1 alpha-2
  • Хэширование: отсутствует

Действительно: US

Неверно: United States of America или USA

Почтовый индекс

  • Не следует хешировать данные почтового индекса.
  • Допускаются как американские, так и международные почтовые индексы.
  • Для США:
    • Допускаются пятизначные коды — например, 94043.
    • Допускаются также 5 цифр, за которыми следует 4-значное расширение — например, 94043-1351 или 940431351.
  • Для всех остальных стран:
    • Форматирование не требуется (нет необходимости переводить в нижний регистр, удалять пробелы и специальные символы).
    • Не указывайте расширения почтовых индексов.
  • Хэширование: отсутствует

Проверка хеш-таблиц и кодирование данных

Для проверки правильности форматирования данных можно использовать следующие скрипты проверки хешей.

JavaScript

База 16

/**
 * @fileoverview Provides the hashing algorithm for User-Provided Data Match, 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 hashArrayBuffer = await crypto.subtle.digest(
      'SHA-256', (new TextEncoder()).encode(formattedToken));
  // Converts the hash buffer to a hexadecimal string.
  return Array.from(new Uint8Array(hashArrayBuffer))
      .map((b) => b.toString(16).padStart(2, '0'))
      .join('');
}

function main() {
  // Expected hash for test@gmail.com:
  // 87924606b4131a8aceeeae8868531fbb9712aaa07a5d3a756b26ce0f5d6ca674
  hash('test@gmail.com').then(result => console.log(result));

  // Expected hash for +18005551212:
  // 61d9111bed3e6d9cfc1bc3b5cb35a402687c4f1546bee061a2bd444fbdd64c44
  hash('+18005551212').then(result => console.log(result));

  // Expected hash for John:
  // 96d9632f363564cc3032521409cf22a852f2032eec099ed5967c0d000cec607a
  hash('John').then(result => console.log(result));

  // Expected hash for Doe:
  // 799ef92a11af918e3fb741df42934f3b568ed2d93ac1df74f1b8d41a27932a6f
  hash('Doe').then(result => console.log(result));
}

main()

Base64

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

База 16

"""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': 87924606b4131a8aceeeae8868531fbb9712aaa07a5d3a756b26ce0f5d6ca674
  - Phone '+18005551212':   61d9111bed3e6d9cfc1bc3b5cb35a402687c4f1546bee061a2bd444fbdd64c44
  - First name 'John':      96d9632f363564cc3032521409cf22a852f2032eec099ed5967c0d000cec607a
  - Last name 'Doe':        799ef92a11af918e3fb741df42934f3b568ed2d93ac1df74f1b8d41a27932a6f
"""

import base64
import hashlib

def updm_hash(token):
# Generates a SHA-256 hash of the input token after normalization.
  return hashlib.sha256(token.strip().lower().encode('utf-8')).hexdigest()

def print_updm_hash(token):
# Prints the SHA-256 hash and the original token.
  print('Hash: "{}"\t(Token: {})'.format(updm_hash(token), token))

def main():
# Hashes and prints sample tokens.
  print_updm_hash('test@gmail.com')
  print_updm_hash('+18005551212')
  print_updm_hash('John')
  print_updm_hash('Doe')

if __name__ == '__main__':
  main()

Base64

"""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()

Идти

База 16

/*
Provides the hashing algorithm, as well as some valid hashes of sample data for testing.

Sample hashes:

  - Email 'test@gmail.com': 87924606b4131a8aceeeae8868531fbb9712aaa07a5d3a756b26ce0f5d6ca674
  - Phone '+18005551212':   61d9111bed3e6d9cfc1bc3b5cb35a402687c4f1546bee061a2bd444fbdd64c44
  - First name 'John':      96d9632f363564cc3032521409cf22a852f2032eec099ed5967c0d000cec607a
  - Last name 'Doe':        799ef92a11af918e3fb741df42934f3b568ed2d93ac1df74f1b8d41a27932a6f
*/
package main

import (
  "crypto/sha256"
  "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 := fmt.Sprintf("%x", 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")
}

Base64

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

База 16

package updm.hashing;

import static java.nio.charset.StandardCharsets.UTF_8;

import com.google.common.base.Ascii;
import com.google.common.hash.Hashing;

/**
 * Example of the UPDM hashing algorithm using hex-encoded SHA-256.
*
* <p>This uses the Guava Hashing to generate the hash: https://github.com/google/guava
*
* <p>Sample valid hashes:
*
* <ul>
*   <li>Email "test@gmail.com": "87924606b4131a8aceeeae8868531fbb9712aaa07a5d3a756b26ce0f5d6ca674"
*   <li>Phone "+18005551212": "61d9111bed3e6d9cfc1bc3b5cb35a402687c4f1546bee061a2bd444fbdd64c44"
*   <li>First name "John": "96d9632f363564cc3032521409cf22a852f2032eec099ed5967c0d000cec607a"
*   <li>Last name "Doe": "799ef92a11af918e3fb741df42934f3b568ed2d93ac1df74f1b8d41a27932a6f"
* </ul>
*/
public final class HashExample {

  private HashExample() {}

  public static String hash(String token) {
    // Normalizes and hashes the input token.
    String formattedToken = Ascii.toLowerCase(token).strip();
    return Hashing.sha256().hashString(formattedToken, UTF_8).toString();
  }

  public static void printHash(String token) {
    // Calculates and prints the token's hash.
    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");
  }
}

Base64

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

База 16

/*
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': 87924606b4131a8aceeeae8868531fbb9712aaa07a5d3a756b26ce0f5d6ca674
  - Phone '+18005551212':   61d9111bed3e6d9cfc1bc3b5cb35a402687c4f1546bee061a2bd444fbdd64c44
  - First name 'John':      96d9632f363564cc3032521409cf22a852f2032eec099ed5967c0d000cec607a
  - Last name 'Doe':        799ef92a11af918e3fb741df42934f3b568ed2d93ac1df74f1b8d41a27932a6f

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 hashed versions of specified columns from the input table.
CREATE TABLE `your_project_name.your_dataset_name.output_hashed_table_name`
AS
SELECT
  UserID,
  TO_HEX(SHA256(LOWER(Email))) AS Email,
  TO_HEX(SHA256(Phone)) AS Phone,
  TO_HEX(SHA256(LOWER(FirstName))) AS FirstName,
  TO_HEX(SHA256(LOWER(LastName))) AS LastName,
  PostalCode,
  CountryCode,
FROM
  `your_project_name.your_dataset_name.input_unhashed_table_name`;

Base64

/*
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. Нажмите «Подключения» > «Создать подключение» > «Соответствие предоставленным пользователем данным» .
  2. Выберите источник данных, затем нажмите «Подключиться» .
  3. При необходимости пройдите аутентификацию, затем нажмите «Далее» :

    BigQuery

    Нажмите «Применить», чтобы предоставить доступ к BigQuery.

    Облачное хранилище

    Нажмите «Применить», чтобы предоставить доступ к облачному хранилищу.

    MySQL

    Введите местоположение вашей базы данных MySQL, порт, имя пользователя и пароль.

    С3

    Введите свой секретный ключ доступа к Amazon S3.

    PostgreSQL

    Введите местоположение вашей базы данных PostgreSQL, порт, имя пользователя, пароль и название базы данных.

    Красное смещение

    Введите местоположение вашей базы данных Redshift, порт, имя пользователя, пароль и название базы данных.

    sFTP

    Введите адрес вашего sFTP-сервера, имя пользователя и пароль.

    Снежинка

    Введите идентификатор вашей учетной записи Snowflake, имя пользователя и пароль.

  4. Настройте источник данных, затем нажмите «Далее» :

    BigQuery

    Выберите таблицу BigQuery для импорта.

    Облачное хранилище

    Введите путь к утилите gsutil, например gs://my-bucket/folder/ и выберите форматирование файла.

    Если вы подключаете этот ресурс впервые, появится предупреждение. Нажмите «Применить», чтобы предоставить доступ, затем нажмите «Далее». Примечание: у вас должна быть роль с разрешением делегировать storage.buckets.setIamPolicy для соответствующего сегмента.

    MySQL

    Выберите базу данных MySQL и таблицу, которые вы хотите использовать.

    С3

    Введите URI файла, который вы хотите загрузить, относительно адреса хоста.

    PostgreSQL

    Введите схему PostgreSQL и имя таблицы (или представления).

    Красное смещение

    Введите схему Redshift и имя таблицы (или представления). По умолчанию Redshift использует URL-адреса расположения базы данных, соответствующие следующему шаблону: cluster-identifier.account-number.aws-region.redshift.amazonaws.com .

    sFTP

    Введите путь и имя файла в / PATH / FILENAME .csv

    Снежинка

    Введите название базы данных Snowflake, схему и таблицу (или представление), которые вы хотите использовать.

  5. Выберите набор данных BigQuery, который будет использоваться в качестве промежуточного целевого хранилища , затем нажмите «Далее» . Этот шаг гарантирует правильное форматирование ваших данных.
  6. Необязательно: измените формат данных. Преобразования включают вычисление хеша, форматирование в нижний/верхний регистр, а также объединение/разделение полей.
    1. Нажмите Действие > > Преобразовать .
    2. В появившейся панели нажмите «Добавить преобразование» или «Добавить другое преобразование».
    3. Выберите тип преобразования из выпадающего меню и укажите необходимые параметры.
    4. Нажмите « Сохранить ».
  7. Выберите как минимум один ключ объединения и сопоставьте поля, которые будете использовать. Ads Data Hub автоматически сопоставит поля с одинаковыми именами, обозначенными параметром . Внесите необходимые изменения, затем нажмите «Далее» .
  8. Составьте расписание:
    1. Укажите название вашего соединения.
    2. Задайте частоту, определив, как часто данные будут импортироваться в набор данных, выбранный на предыдущем шаге. Каждый запуск будет перезаписывать данные в целевой таблице.
    3. Укажите, как следует обрабатывать конфликты идентификаторов пользователей. Вы можете выбрать между сохранением существующего совпадения или перезаписью новыми данными.
  9. Нажмите «Готово» . Таблицы соответствия обычно готовы к запросам через 12 часов после их создания.

Просмотреть сведения о подключении

На странице сведений о подключении отображается информация о последних запусках и ошибках конкретного подключения. Чтобы просмотреть подробную информацию о конкретном подключении:

  1. Нажмите «Подключения» .
  2. Щелкните по названию соединения, чтобы просмотреть его подробные сведения.
  3. Теперь вы можете просмотреть подробную информацию о соединении и последних запусках. Для каждого типа ошибок отображаются два возможных варианта: ошибки на уровне соединения (соединение не было выполнено) и ошибки на уровне строк (строка не была импортирована).
    1. Статус «Сбой» указывает на то, что подключение вообще не удалось выполнить (например, из-за проблем с правами доступа к учетной записи службы). Щелкните по статусу ошибки, чтобы увидеть, какие ошибки повлияли на подключение.
    2. Статус «Завершено» указывает на успешное подключение. Однако могут оставаться ошибки на уровне строк, о чем свидетельствует ненулевое значение в столбце «Строки с ошибками». Щелкните по значению, чтобы узнать подробнее о записях, в которых произошла ошибка.

Редактировать соединение

Следующие данные можно редактировать:

  • Имя подключения
  • Расписание
  • Таблица назначения
  • Картирование полей

Редактирование источника данных не поддерживается. Чтобы изменить источник данных, создайте новое подключение и удалите старое.

Чтобы изменить данные для подключения:

  1. Нажмите «Подключения» .
  2. Щелкните по названию соединения, которое хотите отредактировать.
  3. Отредактируйте нужные параметры:
    • Имя подключения: Нажмите «Изменить» , введите новое имя и нажмите Enter .
    • Расписание: Нажмите «Редактировать» , установите новое расписание, затем нажмите «Сохранить» .
    • Таблица назначения: Нажмите «Редактировать» , введите новое имя таблицы назначения, затем нажмите «Сохранить» .
    • Сопоставление полей: Нажмите , внесите изменения в поля, затем нажмите Сохранить .
  4. Нажмите .

Запрос совпал с данными

Запрос к таблицам совпадений

Когда ваши таблицы соответствия содержат достаточно данных для прохождения проверок конфиденциальности, вы готовы выполнять запросы к этим таблицам.

Исходная таблица для данных от первого лица (1PD) представлена ​​таблицей my_data . Она включает как персональные данные (PII), так и данные, не являющиеся персональными. Использование исходной таблицы может улучшить ваши отчеты, предоставив больше аналитической информации, поскольку она отражает все данные 1PD в рамках данной таблицы по сравнению с таблицей соответствия.

Каждая таблица в схеме Ads Data Hub, содержащая поле user_id сопровождается таблицей соответствия. Например, для таблицы adh.google_ads_impressions Ads Data Hub также генерирует таблицу соответствия adh.google_ads_impressions_updm , содержащую ваши идентификаторы пользователей. Отдельные таблицы соответствия создаются для таблиц сетевой политики. Например, для таблицы adh.google_ads_impressions_policy_isolated_network Ads Data Hub также генерирует таблицу соответствия adh.google_ads_impressions_policy_isolated_network_updm , содержащую ваши идентификаторы пользователей.

Эти таблицы содержат подмножество пользователей, доступных в исходных таблицах, для которых найдено совпадение по 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 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 стало доступно с 1 октября 2024 года. Вы не можете использовать это поле для расчета коэффициентов сопоставления до этой даты.

/* 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 Ads.

Этот запрос показывает, как объединить собственные данные с данными Google Ads:

/* 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» .