Tính năng So khớp dữ liệu do người dùng cung cấp

Tính năng so khớp dữ liệu do người dùng cung cấp (UPDM) kết hợp dữ liệu của bên thứ nhất mà bạn đã thu thập được về một người dùng (chẳng hạn như thông tin trên các trang web, ứng dụng hoặc cửa hàng thực tế của bạn) với hoạt động đăng nhập của người dùng đó trên tất cả dữ liệu quảng cáo của Google, bao gồm cả dữ liệu do Google sở hữu và vận hành. Điều này bao gồm cả dữ liệu được mua thông qua các sản phẩm của Google Marketing Platform (GMP), chẳng hạn như YouTube được mua bằng Display & Video 360. Các sản phẩm khác của GMP không thuộc quyền sở hữu và vận hành của Google sẽ không được hỗ trợ.

Để đủ điều kiện so khớp dữ liệu do người dùng cung cấp, sự kiện quảng cáo phải được liên kết với một người dùng đã đăng nhập trong dữ liệu quảng cáo của Google.

Tài liệu này mô tả tính năng so khớp dữ liệu do người dùng cung cấp và hướng dẫn cách thiết lập cũng như sử dụng.

Tổng quan về thẻ Kết nối

Để thu thập thông tin chi tiết có giá trị về quảng cáo, bạn thường phải kết hợp dữ liệu từ nhiều nguồn. Việc tự xây dựng giải pháp cho vấn đề về quy trình dữ liệu này đòi hỏi bạn phải đầu tư đáng kể về thời gian và kỹ thuật. Trang Connections (Kết nối) trong Ads Data Hub giúp đơn giản hoá quy trình này bằng cách cung cấp một giao diện từng bước có hướng dẫn để nhập, chuyển đổi và so khớp dữ liệu quảng cáo của bạn trong BigQuery, nhờ đó, bạn có thể sử dụng dữ liệu này trong các truy vấn Ads Data Hub hoặc bất kỳ sản phẩm nào khác đọc dữ liệu từ BigQuery. Việc làm phong phú các cụm từ tìm kiếm bằng dữ liệu của bên thứ nhất có thể mang lại trải nghiệm phong phú hơn cho khách hàng và có khả năng chống lại những thay đổi về hoạt động theo dõi quảng cáo trên toàn ngành.

Trang Connections (Kết nối) được xây dựng bằng các công cụ cho phép bạn mã hoá và chia sẻ thông tin nhận dạng cá nhân (PII) với các đối tác theo cách chú trọng đến quyền riêng tư. Sau khi bạn chọn những cột chứa thông tin nhận dạng cá nhân, Ads Data Hub sẽ mã hoá dữ liệu để đảm bảo rằng chỉ những người có quyền mới có thể xuất hoặc đọc dữ liệu của bên thứ nhất. Việc xác định dữ liệu của bên thứ nhất cần thiết cho trường hợp sử dụng đo lường hoặc kích hoạt có thể gặp khó khăn, vì vậy, Ads Data Hub cung cấp một danh sách toàn diện gồm các trường hợp sử dụng được xác định trước, sau đó hướng dẫn bạn trong toàn bộ quá trình trích xuất, chuyển đổi và tải dữ liệu. Mặc dù có thể tạo nhiều loại kết nối, nhưng tài liệu này giả định rằng bạn đang sử dụng trang Kết nối để so khớp dữ liệu do người dùng cung cấp.

Các nguồn dữ liệu được hỗ trợ của bên thứ nhất

Bạn có thể nhập dữ liệu từ các nguồn dữ liệu sau:

  • BigQuery
  • Cloud Storage
  • Giao thức truyền tệp bảo mật (sFTP)
  • Bông tuyết
  • MySQL
  • PostgreSQL
  • Amazon Redshift
  • Amazon S3

Vì tính năng so khớp dữ liệu do người dùng cung cấp chỉ có trên khoảng không quảng cáo do Google sở hữu và điều hành dành cho người dùng đã đăng nhập, nên tính năng này không bị ảnh hưởng bởi việc ngừng sử dụng cookie của bên thứ ba trong thời gian tới. Vì thích ứng với những thay đổi của ngành tốt hơn so với dữ liệu của bên thứ ba, nên dữ liệu này có thể cung cấp thông tin chi tiết phong phú hơn, từ đó giúp tăng mức độ tương tác của khách hàng.

Tìm hiểu thuật ngữ

  • Kết nối dữ liệu do người dùng cung cấp: Thiết lập mối kết nối dữ liệu do người dùng cung cấp để nhập và so khớp dữ liệu, lên lịch nhập dữ liệu, chuyển đổi dữ liệu và so khớp dữ liệu quảng cáo bằng mã nhận dạng người dùng. Sự kiện quảng cáo phải được liên kết với một người dùng đã đăng nhập trong dữ liệu quảng cáo của Google. Cần có nhiều dự án trên Google Cloud.
  • Kết nối dữ liệu của bên thứ nhất: Thiết lập mối kết nối dữ liệu của bên thứ nhất dưới dạng một công cụ chuẩn bị dữ liệu, để lên lịch nhập dữ liệu và chuyển đổi dữ liệu mà không cần các tính năng nâng cao của UPDM. Loại kết nối này chỉ yêu cầu một dự án trên Google Cloud.
  • Nguồn dữ liệu: Một sản phẩm đã kết nối, tệp được nhập hoặc dịch vụ tích hợp với bên thứ ba (ví dụ như BigQuery).
  • Đích đến: Một trường hợp sử dụng; thường là một sản phẩm hoặc tính năng sản phẩm của Google đã kích hoạt dữ liệu được nhập (ví dụ: tính năng so khớp dữ liệu do người dùng cung cấp của Ads Data Hub).
  • Dự án quản trị: Dự án trên Google Cloud chứa dữ liệu quảng cáo độc quyền của bạn ở định dạng thô.
  • Tập dữ liệu đầu ra: Tập dữ liệu BigQuery mà Ads Data Hub ghi vào. Theo mặc định, đây là một tập dữ liệu trong dự án quản trị của bạn. Để thay đổi thành một dự án khác trên Google Cloud, hãy xem phần Định cấu hình tài khoản dịch vụ.

Tóm tắt quy trình

  1. Thiết lập tính năng nhập và so khớp dữ liệu
  2. Nhập và so khớp dữ liệu của bên thứ nhất
    • Bạn định dạng và tải dữ liệu của bên thứ nhất lên tập dữ liệu BigQuery. Để thiết lập đơn giản nhất, hãy sử dụng dự án quản trị. Tuy nhiên, bạn có thể sử dụng mọi tập dữ liệu BigQuery mà bạn sở hữu.
    • Bạn bắt đầu yêu cầu so khớp dữ liệu bằng cách tạo một mối kết nối và thiết lập lịch nhập.
    • Google kết hợp dữ liệu giữa dự án của bạn và dữ liệu thuộc sở hữu của Google có chứa mã nhận dạng người dùng của Google và dữ liệu do người dùng cung cấp đã băm để tạo và cập nhật bảng so khớp.
    • Xem phần Nhập dữ liệu của bên thứ nhất
  3. Các truy vấn đang diễn ra trong Ads Data Hub, dựa trên dữ liệu được so khớp

Tìm hiểu về các yêu cầu về quyền riêng tư

Thu thập dữ liệu khách hàng

Khi sử dụng tính năng so khớp dữ liệu do người dùng cung cấp, bạn phải tải dữ liệu của bên thứ nhất lên. Đây có thể là thông tin mà bạn thu thập được từ các trang web, ứng dụng, cửa hàng thực tế của bạn hoặc bất kỳ thông tin nào mà khách hàng trực tiếp chia sẻ với bạn.

Bạn phải:

  • Đảm bảo rằng chính sách quyền riêng tư của bạn nêu rõ việc bạn chia sẻ dữ liệu khách hàng với các bên thứ ba để họ thay mặt bạn thực hiện các dịch vụ, đồng thời bạn nhận được sự đồng ý của khách hàng cho việc chia sẻ dữ liệu đó khi pháp luật yêu cầu
  • Chỉ sử dụng API hoặc giao diện được phê duyệt của Google để tải dữ liệu khách hàng lên
  • Tuân thủ tất cả các luật và quy định hiện hành, bao gồm cả mọi bộ luật tự quản lý hay bộ luật ngành có thể áp dụng

Xác nhận về sự đồng ý của bên thứ nhất

Để đảm bảo có thể sử dụng dữ liệu của bên thứ nhất trong Ads Data Hub, bạn phải xác nhận rằng bạn đã nhận được sự đồng ý hợp lệ để chia sẻ dữ liệu của người dùng cuối ở Khu vực kinh tế Châu Âu (EEA) với Google theo Chính sách về sự đồng ý của người dùng ở Liên minh Châu ÂuChính sách về Ads Data Hub. Yêu cầu này áp dụng cho từng tài khoản Ads Data Hub và bạn phải cập nhật yêu cầu này mỗi khi tải dữ liệu mới của bên thứ nhất lên. Bất kỳ người dùng nào cũng có thể thay mặt toàn bộ tài khoản đưa ra lời xác nhận này.

Xin lưu ý rằng các quy tắc truy vấn dịch vụ tương tự của Google áp dụng cho các truy vấn phân tích cũng áp dụng cho các truy vấn UPDM. Ví dụ: bạn không thể chạy các truy vấn trên nhiều dịch vụ đối với người dùng ở Khu vực kinh tế Châu Âu (EEA) khi tạo bảng so khớp.

Để tìm hiểu cách xác nhận sự đồng ý trong Ads Data Hub, hãy xem bài viết Yêu cầu về sự đồng ý đối với Khu vực kinh tế Châu Âu.

Kích thước dữ liệu

Để bảo vệ quyền riêng tư của người dùng cuối, tính năng so khớp dữ liệu do người dùng cung cấp sẽ thực thi các yêu cầu sau đây về quy mô dữ liệu của bạn:

  • Bạn phải tải lên ít nhất 1.000 bản ghi trong danh sách người dùng.
  • Mỗi lần cập nhật thành công bảng khớp phải có một số lượng tối thiểu người dùng mới được khớp. Hành vi này tương tự như các bước kiểm tra sự khác biệt.
  • Danh sách của bạn không được vượt quá số lượng bản ghi tối đa. Để tìm hiểu về giới hạn dữ liệu tối đa, hãy liên hệ với người đại diện của Google.

Thiết lập quy trình nhập dữ liệu

.

Trước khi bắt đầu, bạn cần định cấu hình tài khoản Ads Data Hub để tạo các mối kết nối dữ liệu. Đây là cách bạn thiết lập quy trình khớp dữ liệu. Bạn chỉ cần thực hiện các bước này một lần.

Trên trang Kết nối, hãy nhấp vào Bắt đầu thiết lập để mở trình hướng dẫn thiết lập tài khoản ở giai đoạn bật UPDM.

Chuyển đến phần Kết nối

Những quyền nào được cấp cho BigQuery và Cloud Storage?

Nếu bạn thiết lập tính năng UPDM để sử dụng với BigQuery hoặc Cloud Storage, hãy dùng thông tin tham khảo này để tìm hiểu các quyền được cấp cho tài khoản dịch vụ Trung tâm dữ liệu quảng cáo.

BigQuery

Tài khoản dịch vụ Datafusion
Mục đích Tài khoản dịch vụ datafusion được dùng để hiển thị một danh sách các trường nguồn trong Giao diện người dùng Ads Data Hub.
Định dạng service-some-number@gcp-sa-datafusion.iam.gserviceaccount.com
Quyền truy cập bắt buộc
BigQuery Data Viewer
roles/bigquery.dataViewer
đối với các tập dữ liệu cụ thể trong dự án Nguồn dữ liệuĐích đến
Storage Admin
roles/storage.admin
cho dự án Nguồn dữ liệu hoặc một bộ chứa lưu trữ chuyên dụng
Tài khoản dịch vụ Dataproc
Mục đích Tài khoản dịch vụ Dataproc chịu trách nhiệm chạy các quy trình dữ liệu ở chế độ nền.
Định dạng some-number-compute@developer.gserviceaccount.com
Quyền truy cập bắt buộc
BigQuery Data Viewer
roles/bigquery.dataViewer
đối với các tập dữ liệu cụ thể trong dự án Nguồn dữ liệuĐích đến
BigQuery Data Editor
roles/bigquery.dataEditor
đối với các tập dữ liệu cụ thể trong dự án Đích đến
BigQuery Job User
roles/bigquery.jobUser
cho cả dự án Nguồn dữ liệuĐích đến
Storage Admin
roles/storage.admin
cho cả dự án Nguồn dữ liệuĐích đến hoặc một vùng lưu trữ chuyên dụng
Tài khoản dịch vụ UPDM
Mục đích Tài khoản dịch vụ UPDM được dùng để chạy công việc trùng khớp.
Định dạng service-some-number@gcp-sa-adsdataconnector.iam.gserviceaccount.com
Quyền truy cập bắt buộc
BigQuery Data Viewer
roles/bigquery.dataViewer
cho dự án Destination
BigQuery Job User
roles/bigquery.jobUser
cho dự án Destination

Cloud Storage

Tài khoản dịch vụ Datafusion
Mục đích Tài khoản dịch vụ datafusion được dùng để hiển thị một danh sách các trường nguồn trong Giao diện người dùng Ads Data Hub.
Định dạng service-some-number@gcp-sa-datafusion.iam.gserviceaccount.com
Quyền truy cập bắt buộc
Storage Object Viewer
roles/storage.objectViewer
đối với các vùng lưu trữ cụ thể trong dự án Nguồn dữ liệu
BigQuery Data Viewer
roles/bigquery.dataViewer
cho dự án Nguồn dữ liệu hoặc một bộ chứa lưu trữ chuyên dụng
Storage Admin
roles/storage.admin
cho dự án Nguồn dữ liệu hoặc một bộ chứa lưu trữ chuyên dụng
Tài khoản dịch vụ Dataproc
Mục đích Tài khoản dịch vụ Dataproc chịu trách nhiệm chạy các quy trình dữ liệu ở chế độ nền.
Định dạng some-number-compute@developer.gserviceaccount.com
Quyền truy cập bắt buộc
Storage Admin
roles/storage.admin
cho cả dự án Nguồn dữ liệuĐích đến hoặc một vùng lưu trữ chuyên dụng
BigQuery Job User
roles/bigquery.jobUser
cho dự án Destination
Tài khoản dịch vụ UPDM
Mục đích Tài khoản dịch vụ UPDM được dùng để chạy công việc trùng khớp.
Định dạng service-some-number@gcp-sa-adsdataconnector.iam.gserviceaccount.com
Quyền truy cập bắt buộc
BigQuery Data Viewer
roles/bigquery.dataViewer
cho dự án Destination
BigQuery Job User
roles/bigquery.jobUser
cho dự án Destination

Các nguồn dữ liệu khác

Không cần thiết đối với các nguồn dữ liệu khác

Nhập và so khớp dữ liệu của bên thứ nhất

Định dạng dữ liệu để nhập

Dữ liệu của bạn phải tuân thủ các yêu cầu về định dạng sau đây để được so khớp chính xác:

  • Khi được chỉ ra trong phần mô tả trường nhập sau đây, bạn phải tải lên bằng cách sử dụng thuật toán băm SHA256.
  • Các trường đầu vào phải được định dạng dưới dạng chuỗi. Ví dụ: nếu bạn đang sử dụng hàm băm SHA256 của BigQuery với hàm mã hoá Base16 (TO_HEX), hãy sử dụng phép biến đổi sau: TO_HEX(SHA256(user_data)).
  • UPDM hỗ trợ cả phương thức mã hoá Base16 và Base64. Bạn phải điều chỉnh việc mã hoá dữ liệu của bên thứ nhất cho phù hợp với việc giải mã được dùng trong truy vấn Ads Data Hub. Nếu thay đổi phương thức mã hoá dữ liệu của bên thứ nhất, bạn phải cập nhật truy vấn Ads Data Hub để giải mã từ cùng một cơ sở. Các ví dụ sau đây sử dụng phương thức mã hoá Base16.

User ID

  • Văn bản thuần túy
  • Băm: Không có

Email

  • Xoá khoảng trắng ở đầu và ở cuối
  • Chữ thường tất cả ký tự
  • Cung cấp tên miền của tất cả các địa chỉ email (như gmail.com hoặc hotmail.co.jp)
  • Xoá dấu – ví dụ: thay đổi è, é, ê hoặc ë thành e
  • Xoá tất cả dấu chấm (.) đứng trước tên miền trong địa chỉ email gmail.comgooglemail.com
  • Băm: SHA256 được mã hoá Base16

Có hiệu lực: TO_HEX(SHA256("jeffersonloveshiking@gmail.com"))

Không hợp lệ: TO_HEX(SHA256("JéffersonLôvesHiking@gmail.com"))

Điện thoại

  • Xoá khoảng trắng
  • Định dạng theo định dạng E.164 – ví dụ: Hoa Kỳ: +14155552671, Vương quốc Anh: +442071838750
  • Xoá tất cả ký tự đặc biệt, ngoại trừ dấu "+" trước mã quốc gia
  • Băm: SHA256 được mã hoá Base16

Có hiệu lực: TO_HEX(SHA256("+18005550101"))

Không hợp lệ: TO_HEX(SHA256("(800) 555-0101"))

Tên

  • Xoá khoảng trắng
  • Chữ thường tất cả ký tự
  • Xoá tất cả tiền tố, ví dụ: Bà, Ông, Cô, Tiến sĩ
  • Không xoá dấu – ví dụ: è, é, ê hoặc ë
  • Băm: SHA256 được mã hoá Base16

Có hiệu lực: TO_HEX(SHA256("daní"))

Không hợp lệ: TO_HEX(SHA256("Daní"))

Họ

  • Xoá khoảng trắng
  • Chữ thường tất cả ký tự
  • Xoá tất cả hậu tố, ví dụ: Jr., Sr., 2nd, 3rd, II, III, PHD, MD
  • Không xoá dấu – ví dụ: è, é, ê hoặc ë
  • Băm: SHA256 được mã hoá Base16

Có hiệu lực: TO_HEX(SHA256("delacruz"))

Không hợp lệ: TO_HEX(SHA256("de la Cruz, Jr."))

Quốc gia

  • Cung cấp mã quốc gia ngay cả khi tất cả dữ liệu khách hàng của bạn đến từ cùng một quốc gia
  • Không băm dữ liệu quốc gia
  • Sử dụng mã quốc gia theo ISO 3166-1 alpha-2
  • Băm: Không có

Có hiệu lực: US

Không hợp lệ: United States of America hoặc USA

Mã vùng

  • Không băm dữ liệu mã bưu chính
  • Có thể sử dụng cả mã bưu chính của Mỹ và mã bưu chính quốc tế
  • Đối với Hoa Kỳ:
    • Có thể sử dụng mã 5 chữ số, ví dụ: 94043
    • Bạn cũng có thể sử dụng mã bưu chính gồm 5 chữ số kèm theo 4 số mở rộng phía sau, ví dụ: 94043-1351 hoặc 940431351
  • Đối với tất cả các quốc gia khác:
    • Không cần định dạng (Không cần viết thường hoặc xoá dấu cách và ký tự đặc biệt)
    • Bỏ phần mở rộng mã bưu chính
  • Băm: Không có

Xác thực hàm băm và mã hoá dữ liệu

Bạn có thể sử dụng các tập lệnh xác thực hàm băm sau đây để đảm bảo dữ liệu của bạn được định dạng chính xác.

JavaScript

Base16

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

Base16

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

Go

Base16

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

Base16

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

Base16

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

Khóa kết hợp

Một số tổ hợp dữ liệu do người dùng cung cấp sẽ hiệu quả hơn những tổ hợp khác. Sau đây là danh sách các tổ hợp dữ liệu do người dùng cung cấp, được xếp hạng theo mức độ tương đối. Nếu sử dụng địa chỉ, bạn phải cung cấp: Tên, Họ, Quốc gia và Mã bưu chính.

  1. Email, số điện thoại, địa chỉ (mạnh nhất)
  2. Điện thoại, Địa chỉ
  3. Email, Địa chỉ
  4. Email, Điện thoại
  5. Địa chỉ
  6. Điện thoại
  7. Email (yếu nhất)

Tạo bảng so khớp

  1. Nhấp vào Kết nối > Tạo kết nối > So khớp dữ liệu do người dùng cung cấp.
  2. Chọn một nguồn dữ liệu, rồi nhấp vào Kết nối.
  3. Xác thực (nếu được nhắc), rồi nhấp vào Tiếp theo:

    BigQuery

    Nhấp vào Áp dụng để cấp quyền truy cập vào BigQuery.

    Cloud Storage

    Nhấp vào Áp dụng để cấp quyền truy cập vào Cloud Storage.

    MySQL

    Nhập vị trí cơ sở dữ liệu, cổng, tên người dùng và mật khẩu của MySQL.

    S3

    Nhập khoá truy cập bí mật của Amazon S3.

    PostgreSQL

    Nhập vị trí cơ sở dữ liệu, cổng, tên người dùng, mật khẩu và cơ sở dữ liệu của PostgreSQL.

    Redshift

    Nhập vị trí cơ sở dữ liệu, cổng, tên người dùng, mật khẩu và cơ sở dữ liệu của Redshift.

    sFTP

    Nhập vị trí, tên người dùng và mật khẩu của máy chủ SFTP.

    Bông tuyết

    Nhập mã nhận dạng, tên người dùng và mật khẩu của tài khoản Snowflake.

  4. Định cấu hình nguồn dữ liệu, rồi nhấp vào Tiếp theo:

    BigQuery

    Chọn bảng BigQuery để nhập.

    Cloud Storage

    Nhập đường dẫn gsutil, chẳng hạn như gs://my-bucket/folder/ và chọn định dạng tệp.

    Nếu đây là lần đầu tiên bạn kết nối tài nguyên này, một cảnh báo sẽ xuất hiện. Nhấp vào Áp dụng để cấp quyền truy cập, rồi nhấp vào Tiếp theo. Lưu ý: Bạn phải có một vai trò có quyền uỷ quyền storage.buckets.setIamPolicy cho bộ chứa liên quan.

    MySQL

    Chọn bảng và cơ sở dữ liệu MySQL mà bạn muốn sử dụng.

    S3

    Nhập URI đến tệp mà bạn muốn tải lên, tương ứng với địa chỉ máy chủ lưu trữ.

    PostgreSQL

    Nhập tên giản đồ và bảng (hoặc chế độ xem) PostgreSQL.

    Redshift

    Nhập tên giản đồ và bảng (hoặc chế độ xem) Redshift. Theo mặc định, Redshift sử dụng URL của vị trí cơ sở dữ liệu tuân theo mẫu sau: cluster-identifier.account-number.aws-region.redshift.amazonaws.com .

    sFTP

    Nhập đường dẫn và tên tệp, được định dạng là /PATH/FILENAME.csv

    Bông tuyết

    Nhập cơ sở dữ liệu, giản đồ và bảng (hoặc chế độ xem) Snowflake mà bạn muốn sử dụng.

  5. Chọn một tập dữ liệu BigQuery để dùng làm đích đến trung gian, rồi nhấp vào Tiếp theo. Bước này giúp đảm bảo rằng dữ liệu của bạn được định dạng chính xác.
  6. Không bắt buộc: Sửa đổi định dạng dữ liệu. Các phép biến đổi bao gồm tính toán hàm băm, định dạng chữ thường/chữ hoa và hợp nhất/phân tách các trường.
    1. Nhấp vào Thao tác > > Biến đổi.
    2. Trong bảng bật lên, hãy nhấp vào Thêm phép biến đổi hoặc Thêm một phép biến đổi khác
    3. Chọn một kiểu biến đổi trong trình đơn thả xuống và nhập các yêu cầu.
    4. Nhấp vào Lưu.
  7. Chọn ít nhất một khoá kết hợp và liên kết các trường mà bạn sẽ sử dụng. Ads Data Hub sẽ tự động liên kết các trường có tên giống hệt nhau, được biểu thị bằng biểu tượng . Chỉnh sửa nếu cần, rồi nhấp vào Tiếp theo.
  8. Đặt lịch biểu:
    1. Đặt tên cho mối kết nối.
    2. Đặt tần suất để xác định tần suất nhập dữ liệu vào tập dữ liệu mà bạn đã chọn ở bước trước. Mỗi lần chạy sẽ ghi đè dữ liệu trong bảng đích đến.
    3. Chỉ định cách bạn muốn xử lý trường hợp trùng mã nhận dạng người dùng. Bạn có thể chọn giữ lại kết quả khớp hiện có hoặc ghi đè bằng dữ liệu mới.
  9. Nhấp vào Hoàn tất. Các bảng so khớp thường sẵn sàng để được truy vấn 12 giờ sau khi được tạo.

Xem thông tin chi tiết về mối kết nối

Trang chi tiết về mối kết nối cung cấp cho bạn thông tin về các lần chạy và lỗi gần đây của một mối kết nối nhất định. Cách xem thông tin chi tiết về một kết nối cụ thể:

  1. Nhấp vào Kết nối.
  2. Nhấp vào tên của mối kết nối để xem thông tin chi tiết.
  3. Giờ đây, bạn có thể xem thông tin chi tiết và các lần chạy gần đây của mối kết nối. Mỗi loại lỗi cho thấy 2 loại lỗi có thể xảy ra: lỗi ở cấp độ kết nối (kết nối không chạy) và lỗi ở cấp độ hàng (một hàng không được nhập).
    1. Trạng thái Thất bại cho biết toàn bộ kết nối không chạy được (ví dụ: vấn đề về quyền của tài khoản dịch vụ). Nhấp vào trạng thái lỗi để xem những lỗi nào ảnh hưởng đến kết nối.
    2. Trạng thái Đã hoàn tất cho biết kết nối đã chạy thành công. Tuy nhiên, vẫn có thể xảy ra lỗi ở cấp hàng – được biểu thị bằng giá trị khác 0 trong cột "Hàng có lỗi". Nhấp vào giá trị để tìm hiểu thêm về những bản ghi không thành công.

Chỉnh sửa mối kết nối

Bạn có thể chỉnh sửa những thông tin sau:

  • Tên kết nối
  • Lên lịch
  • Bảng điểm đến
  • Liên kết đến trường

Không hỗ trợ việc chỉnh sửa nguồn dữ liệu. Để thay đổi nguồn dữ liệu, hãy tạo một mối kết nối mới và xoá mối kết nối cũ.

Cách chỉnh sửa thông tin chi tiết về mối kết nối:

  1. Nhấp vào Kết nối.
  2. Nhấp vào tên của mối kết nối mà bạn muốn chỉnh sửa.
  3. Chỉnh sửa thông tin chi tiết mà bạn muốn thay đổi:
    • Tên kết nối: Nhấp vào Chỉnh sửa, nhập tên mới rồi nhấn Enter.
    • Lịch biểu: Nhấp vào Chỉnh sửa, đặt lịch biểu mới, rồi nhấp vào Lưu.
    • Bảng đích đến: Nhấp vào Chỉnh sửa, nhập tên đích đến mới, rồi nhấp vào Lưu.
    • Liên kết trường: Nhấp vào biểu tượng , chỉnh sửa các trường, rồi nhấp vào Lưu.
  4. Nhấp vào .

Dữ liệu được so khớp với truy vấn

Truy vấn bảng so khớp

Khi các bảng khớp chứa đủ dữ liệu để đáp ứng các quy trình kiểm tra quyền riêng tư, bạn đã sẵn sàng chạy các truy vấn đối với các bảng.

Bảng ban đầu cho dữ liệu của bên thứ nhất (1PD) được biểu thị bằng my_data. Điều này bao gồm cả Thông tin nhận dạng cá nhân (PII) và dữ liệu không phải là PII. Việc sử dụng bảng gốc có thể cải thiện báo cáo của bạn bằng nhiều thông tin chi tiết hơn, vì bảng này thể hiện tất cả dữ liệu bên thứ nhất trong phạm vi, khi so sánh với bảng khớp.

Mỗi bảng trong giản đồ Ads Data Hub chứa một trường user_id đều đi kèm với một bảng so khớp. Ví dụ: đối với bảng adh.google_ads_impressions, Ads Data Hub cũng tạo một bảng so khớp có tên là adh.google_ads_impressions_updm chứa mã nhận dạng người dùng của bạn. Các bảng so khớp riêng biệt được tạo cho các bảng mạng bị cô lập theo chính sách. Ví dụ: đối với bảng adh.google_ads_impressions_policy_isolated_network, Ads Data Hub cũng tạo một bảng so khớp có tên là adh.google_ads_impressions_policy_isolated_network_updm chứa mã nhận dạng người dùng của bạn.

Các bảng này chứa một nhóm nhỏ người dùng có trong các bảng ban đầu, trong đó có một giá trị trùng khớp trên user_id. Ví dụ: nếu bảng ban đầu chứa dữ liệu cho Người dùng A và Người dùng B, nhưng chỉ Người dùng A được so khớp, thì Người dùng B sẽ không có trong bảng so khớp.

Các bảng khớp chứa một cột bổ sung có tên là customer_data_user_id, lưu trữ giá trị nhận dạng người dùng dưới dạng BYTES.

Bạn nên xem xét loại trường khi viết các truy vấn. Các toán tử so sánh SQL giả định rằng các giá trị cố định mà bạn đang so sánh có cùng một loại. Tuỳ thuộc vào cách user_id được lưu trữ trong bảng dữ liệu của bên thứ nhất, bạn có thể cần mã hoá các giá trị trong bảng trước khi so khớp dữ liệu. Bạn cần truyền khoá kết hợp vào BYTES để có các kết quả khớp thành công:

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

Ngoài ra, các phép so sánh chuỗi trong SQL có phân biệt chữ hoa chữ thường, vì vậy, bạn có thể cần mã hoá các chuỗi ở cả hai phía của phép so sánh để đảm bảo rằng bạn có thể so sánh chính xác các chuỗi đó.

Truy vấn mẫu

Số người dùng trùng khớp

Truy vấn này đếm số lượng người dùng được so khớp trong bảng hiển thị Google Ads.

/* Count matched users in Google Ads impressions table */

SELECT COUNT(DISTINCT user_id)
FROM adh.google_ads_impressions_updm

Tính tỷ lệ khớp

Không phải người dùng nào cũng đủ điều kiện để được ghép nối. Ví dụ: Người dùng đã đăng xuất, trẻ em và người dùng chưa đồng ý sẽ không được so khớp thông qua UPDM. Bạn có thể sử dụng trường is_updm_eligible để tính toán tỷ lệ khớp UPDM chính xác hơn. Xin lưu ý rằng trường is_updm_eligible bắt đầu có hiệu lực từ ngày 1 tháng 10 năm 2024. Bạn không thể sử dụng trường này để tính tỷ lệ khớp trước ngày đó.

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

Kết hợp dữ liệu của bên thứ nhất và dữ liệu Google Ads

Truy vấn này cho biết cách kết hợp dữ liệu của bên thứ nhất với dữ liệu 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

Câu hỏi thường gặp về UPDM

Để xem danh sách câu hỏi thường gặp liên quan đến UPDM, hãy xem Câu hỏi thường gặp về UPDM.