Pencocokan data yang disediakan pengguna (UPDM) menggabungkan data pihak pertama yang telah Anda kumpulkan tentang pengguna—seperti informasi dari situs, aplikasi, atau toko fisik—dengan aktivitas login pengguna tersebut di semua data iklan Google, termasuk data yang dimiliki & dioperasikan Google. Hal ini mencakup data yang dibeli melalui produk Google Marketing Platform (GMP), misalnya, YouTube yang dibeli menggunakan Display & Video 360. Produk GMP lainnya yang tidak dimiliki & dioperasikan Google tidak didukung.
Agar memenuhi syarat untuk pencocokan data yang disediakan pengguna, peristiwa iklan harus ditautkan ke pengguna yang login di data iklan Google.
Dokumen ini menjelaskan fitur pencocokan data yang disediakan pengguna, dan memberikan panduan tentang penyiapan dan penggunaan.
Ringkasan Tab Koneksi
Untuk mendapatkan insight iklan yang berharga, Anda sering kali harus menggabungkan data dari beberapa sumber. Membuat solusi Anda sendiri untuk masalah pipeline data ini memerlukan investasi waktu dan investasi engineer yang signifikan. Halaman Koneksi di Ads Data Hub menyederhanakan proses ini dengan menyediakan antarmuka terpandu langkah demi langkah untuk mengimpor, mentransformasi, dan mencocokkan data iklan Anda di BigQuery, sehingga Anda dapat menggunakannya dalam kueri Ads Data Hub, atau produk lain yang membaca dari BigQuery. Memperkaya kueri dengan data pihak pertama dapat memberikan pengalaman pelanggan yang lebih kaya, dan lebih tahan terhadap perubahan pelacakan iklan di seluruh industri.
Halaman Koneksi dibuat dengan alat yang memungkinkan Anda mengenkripsi dan membagikan informasi identitas pribadi (PII) kepada partner dengan cara yang berfokus pada privasi. Setelah memilih kolom yang berisi PII, Ads Data Hub akan mengenkripsi data, sehingga memastikan bahwa data pihak pertama Anda hanya dapat diekspor atau dibaca oleh orang yang memiliki izin untuk melakukannya. Mengetahui data pihak pertama mana yang diperlukan untuk kasus penggunaan pengukuran atau aktivasi Anda mungkin sulit, jadi Ads Data Hub menyediakan daftar komprehensif kasus penggunaan yang telah ditentukan, lalu memandu Anda melalui seluruh pengalaman mengekstrak, mengubah, dan memuat data. Meskipun dapat membuat beberapa jenis koneksi, dokumen ini menganggap bahwa Anda menggunakan halaman Koneksi untuk pencocokan data yang disediakan pengguna.
Sumber data pihak pertama yang didukung
Anda dapat mengimpor data dari sumber data berikut:
- BigQuery
- Cloud Storage
- Secure FTP (sFTP)
- Snowflake
- MySQL
- PostgreSQL
- Amazon Redshift
- Amazon S3
Karena pencocokan data yang disediakan pengguna hanya tersedia di inventaris yang dimiliki dan dikelola oleh Google untuk pengguna yang login, pencocokan data tersebut tidak akan terpengaruh oleh penghentian cookie pihak ketiga yang akan datang. Karena lebih tahan terhadap perubahan industri daripada data pihak ketiga, data ini dapat memberikan insight yang lebih beragam, yang dapat menghasilkan engagement pelanggan yang lebih tinggi.
Pelajari terminologi.
- Koneksi data yang disediakan pengguna: Siapkan koneksi data yang disediakan pengguna untuk mengimpor dan mencocokkan data Anda, menjadwalkan impor data, mengubah data, dan mencocokkan data iklan Anda menggunakan ID pengguna. Peristiwa iklan harus ditautkan ke pengguna yang login di data iklan Google. Memerlukan beberapa project Google Cloud.
- Koneksi data pihak pertama: Siapkan koneksi data pihak pertama sebagai alat persiapan data, untuk menjadwalkan impor data dan mengubah data tanpa fitur lanjutan UPDM. Jenis koneksi ini hanya memerlukan satu project Google Cloud.
- Sumber data: Produk yang terhubung, file yang diimpor, atau integrasi pihak ketiga, misalnya, BigQuery.
- Tujuan: Kasus penggunaan; biasanya produk atau fitur produk Google, tempat data yang diimpor akan diaktifkan, misalnya, pencocokan data yang disediakan pengguna Ads Data Hub.
- Project admin: Project Google Cloud yang berisi data iklan eksklusif Anda dalam format mentah.
- Set data output: Set data BigQuery yang ditulis oleh Ads Data Hub. Secara default, ini adalah set data dalam project admin Anda. Untuk mengubahnya ke project Google Cloud lain, lihat Mengonfigurasi akun layanan.
Ringkasan proses
- Penyiapan penyerapan dan pencocokan data
- Anda memberikan izin yang diperlukan ke akun layanan di project admin. Lihat Menyiapkan penyerapan data.
- Penyerapan dan pencocokan data pihak pertama
- Anda memformat dan mengupload data pihak pertama ke set data BigQuery. Untuk penyiapan paling mudah, gunakan project admin Anda. Namun, Anda dapat menggunakan set data BigQuery yang Anda miliki.
- Anda memulai permintaan pencocokan data dengan membuat koneksi dan menetapkan jadwal impor.
- Google menggabungkan data antara project Anda dan data milik Google yang berisi ID pengguna Google dan data yang diberikan pengguna yang di-hash untuk membuat dan memperbarui tabel pencocokan.
- Lihat Menyerap data pihak pertama
- Kueri yang sedang berlangsung di Ads Data Hub, berdasarkan data yang cocok
- Anda menjalankan kueri terhadap tabel pencocokan dengan cara yang sama seperti menjalankan kueri reguler di Ads Data Hub. Lihat Membuat kueri data yang cocok.
Mempelajari persyaratan privasi
Mengumpulkan data pelanggan
Saat menggunakan pencocokan data yang disediakan pengguna, Anda harus mengupload data pihak pertama. Informasi ini dapat berupa informasi yang Anda kumpulkan dari situs, aplikasi, toko fisik, atau informasi apa pun yang dibagikan pelanggan kepada Anda secara langsung.
Anda harus:
- Memastikan bahwa kebijakan privasi Anda mengungkapkan bahwa Anda membagikan data pelanggan kepada pihak ketiga untuk melakukan layanan atas nama Anda, dan bahwa Anda mendapatkan izin untuk membagikan data tersebut jika diwajibkan secara hukum
- Hanya menggunakan API atau antarmuka yang disetujui Google untuk mengupload data pelanggan
- Mematuhi semua hukum dan peraturan yang berlaku, termasuk peraturan mandiri atau aturan industri yang mungkin berlaku
Konfirmasi izin pihak pertama
Untuk memastikan Anda dapat menggunakan data pihak pertama di Ads Data Hub, Anda harus mengonfirmasi bahwa Anda telah memperoleh izin yang sesuai untuk membagikan data dari pengguna akhir EEA ke Google sesuai dengan kebijakan izin pengguna Uni Eropa dan kebijakan Ads Data Hub. Persyaratan ini berlaku untuk setiap akun Ads Data Hub, dan harus diperbarui setiap kali Anda mengupload data pihak pertama baru. Setiap pengguna dapat memberikan konfirmasi ini atas nama seluruh akun.
Perhatikan bahwa aturan kueri layanan Google yang sama yang berlaku untuk kueri analisis juga berlaku untuk kueri UPDM. Misalnya, Anda tidak dapat menjalankan kueri lintas layanan pada pengguna di EEA saat membuat tabel pencocokan.
Untuk mempelajari cara mengonfirmasi izin di Ads Data Hub, lihat Persyaratan izin untuk Wilayah Ekonomi Eropa.
Ukuran data
Untuk melindungi privasi pengguna akhir, pencocokan data yang disediakan pengguna menerapkan persyaratan berikut terkait ukuran data Anda:
- Anda harus mengupload minimal 1.000 data dalam daftar pengguna.
- Setiap pembaruan tabel pencocokan yang berhasil harus menyertakan jumlah minimum pengguna yang baru dicocokkan. Perilaku ini mirip dengan pemeriksaan perbedaan.
- Daftar Anda tidak boleh melebihi jumlah maksimum data. Untuk mempelajari batas data maksimum, hubungi perwakilan Google Anda.
Menyiapkan penyerapan data
Sebelum memulai, Anda perlu mengonfigurasi akun Ads Data Hub untuk membuat koneksi data, yang merupakan cara Anda membuat pipeline pencocokan data. Anda hanya perlu melakukan langkah ini satu kali.
Dari halaman Connections, klik Begin setup untuk membuka wizard penyiapan akun pada tahap pengaktifan UPDM.
Izin apa yang diberikan untuk BigQuery dan Cloud Storage?
Jika Anda menyiapkan UPDM untuk digunakan dengan BigQuery atau Cloud Storage, gunakan referensi ini untuk memahami izin yang diberikan ke akun layanan Ads Data Hub.
BigQuery
Akun layanan Datafusion | |||||||||
Tujuan | Akun layanan datafusion digunakan untuk menampilkan daftar kolom sumber di UI Ads Data Hub. | ||||||||
Format | service-some-number@gcp-sa-datafusion.iam.gserviceaccount.com |
||||||||
Akses yang diperlukan |
|
||||||||
Akun layanan Dataproc | |||||||||
Tujuan | Akun layanan dataproc bertanggung jawab untuk menjalankan pipeline data di latar belakang. | ||||||||
Format | some-number-compute@developer.gserviceaccount.com |
||||||||
Akses yang diperlukan |
|
||||||||
Akun layanan UPDM | |||||||||
Tujuan | Akun layanan UPDM digunakan untuk menjalankan tugas yang cocok. | ||||||||
Format | service-some-number@gcp-sa-adsdataconnector.iam.gserviceaccount.com |
||||||||
Akses yang diperlukan |
|
Cloud Storage
Akun layanan Datafusion | |||||||
Tujuan | Akun layanan datafusion digunakan untuk menampilkan daftar kolom sumber di UI Ads Data Hub. | ||||||
Format | service-some-number@gcp-sa-datafusion.iam.gserviceaccount.com |
||||||
Akses yang diperlukan |
|
||||||
Akun layanan Dataproc | |||||||
Tujuan | Akun layanan dataproc bertanggung jawab untuk menjalankan pipeline data di latar belakang. | ||||||
Format | some-number-compute@developer.gserviceaccount.com |
||||||
Akses yang diperlukan |
|
||||||
Akun layanan UPDM | |||||||
Tujuan | Akun layanan UPDM digunakan untuk menjalankan tugas yang cocok. | ||||||
Format | service-some-number@gcp-sa-adsdataconnector.iam.gserviceaccount.com |
||||||
Akses yang diperlukan |
|
Sumber data lain
Tidak diperlukan untuk sumber data lain
Mengambil dan mencocokkan data pihak pertama
Memformat data untuk input
Data Anda harus mematuhi persyaratan pemformatan ini agar dapat dicocokkan dengan benar:
- Jika ditunjukkan dalam deskripsi kolom input berikut, Anda harus mengupload menggunakan hashing SHA256.
- Kolom input harus diformat sebagai string. Misalnya, jika Anda menggunakan fungsi hash SHA256 BigQuery dengan fungsi encoding Base16 (TO_HEX), gunakan transformasi berikut:
TO_HEX(SHA256(user_data))
. - UPDM mendukung encoding Base16 dan Base64. Anda harus menyelaraskan encoding data pihak pertama dengan decoding yang digunakan dalam kueri Ads Data Hub. Jika mengubah encoding data pihak pertama, Anda harus memperbarui kueri Ads Data Hub untuk mendekode dari basis yang sama. Contoh berikut menggunakan encoding Base16.
ID Pengguna
- Teks biasa
- Hashing: None
- Menghapus spasi kosong di awal dan di akhir
- Semua karakter harus berupa huruf kecil
- Sertakan nama domain untuk semua alamat email, seperti gmail.com atau hotmail.co.jp
- Menghapus aksen—misalnya, mengubah è, é, ê, atau ë menjadi e
- Menghapus semua titik (.) yang mendahului nama domain di alamat email
gmail.com
dangooglemail.com
- Hashing: SHA256 yang dienkode Base16
Valid: TO_HEX(SHA256("jeffersonloveshiking@gmail.com"))
Tidak valid: TO_HEX(SHA256("JéffersonLôvesHiking@gmail.com"))
Telepon
- Menghapus spasi kosong
- Format dalam format E.164—misalnya, contoh AS: +14155552671, contoh Inggris Raya: +442071838750
- Hapus semua karakter khusus kecuali "+" sebelum kode negara
- Hashing: SHA256 yang dienkode Base16
Valid: TO_HEX(SHA256("+18005550101"))
Tidak valid: TO_HEX(SHA256("(800) 555-0101"))
Nama depan
- Menghapus spasi kosong
- Semua karakter harus berupa huruf kecil
- Hapus semua awalan, misalnya Ny., Tn., Nn., Dr.
- Jangan hapus aksen—misalnya, è, é, ê, atau ë
- Hashing: SHA256 yang dienkode Base16
Valid: TO_HEX(SHA256("daní"))
Tidak valid: TO_HEX(SHA256("Daní"))
Nama belakang
- Menghapus spasi kosong
- Semua karakter harus berupa huruf kecil
- Hapus semua akhiran, misalnya Jr., Sr., 2nd, 3rd, II, III, PHD, MD
- Jangan hapus aksen—misalnya, è, é, ê, atau ë
- Hashing: SHA256 yang dienkode Base16
Valid: TO_HEX(SHA256("delacruz"))
Tidak valid: TO_HEX(SHA256("de la Cruz, Jr."))
Negara
- Sertakan kode negara meskipun semua data pelanggan Anda berasal dari negara yang sama
- Jangan hash data negara
- Gunakan kode negara ISO 3166-1 alpha-2
- Hashing: None
Valid: US
Tidak valid: United States of America
atau USA
Kode pos
- Jangan melakukan hashing pada data kode pos
- Kode zip/pos AS dan internasional diizinkan
- Untuk AS:
- Kode 5 digit diizinkan—misalnya, 94043
- 5 digit yang diikuti dengan ekstensi 4 digit juga diizinkan—misalnya, 94043-1351 atau 940431351
- Untuk semua negara lain:
- Tidak perlu format (Tidak perlu menggunakan huruf kecil, atau menghapus spasi dan karakter khusus)
- Jangan sertakan ekstensi kode pos
- Hashing: None
Validasi hash dan encoding data
Anda dapat menggunakan skrip validasi hash berikut untuk memastikan data Anda diformat dengan benar.
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`;
Kunci penghubung
Beberapa kombinasi data yang disediakan pengguna lebih kuat daripada yang lain. Berikut adalah daftar berbagai kombinasi data yang disediakan pengguna, yang diberi peringkat berdasarkan kekuatan relatif. Jika menggunakan alamat, Anda harus menyertakan: Nama depan, Nama belakang, Negara, dan kode pos.
- Email, Telepon, Alamat (terkuat)
- Telepon, Alamat
- Email, Alamat
- Email, Telepon
- Alamat
- Telepon
- Email (paling lemah)
Membuat tabel kecocokan
- Klik Koneksi > Buat koneksi > Pencocokan data yang disediakan pengguna.
- Pilih sumber data, lalu klik Hubungkan.
- Lakukan autentikasi, jika diminta, lalu klik Berikutnya:
BigQuery
Klik Terapkan untuk memberikan akses ke BigQuery.
Cloud Storage
Klik Terapkan untuk memberikan akses ke Cloud Storage.
MySQL
Masukkan lokasi database, port, nama pengguna, dan sandi MySQL Anda.
S3
Masukkan kunci akses rahasia Amazon S3 Anda.
PostgreSQL
Masukkan lokasi database, port, nama pengguna, sandi, dan database PostgreSQL Anda.
Redshift
Masukkan lokasi database, port, nama pengguna, sandi, dan database Redshift Anda.
sFTP
Masukkan lokasi, nama pengguna, dan sandi server sFTP Anda.
Snowflake
Masukkan ID akun, nama pengguna, dan sandi Snowflake Anda.
- Konfigurasikan sumber data Anda, lalu klik Berikutnya:
BigQuery
Pilih tabel BigQuery yang akan diimpor.
Cloud Storage
Masukkan jalur gsutil, seperti
gs://my-bucket/folder/
, lalu pilih format file Anda.Jika ini adalah pertama kalinya Anda menghubungkan resource ini, peringatan akan muncul. Klik Terapkan untuk memberikan akses, lalu klik Berikutnya. Catatan: Anda harus memiliki peran dengan izin untuk mendelegasikan
storage.buckets.setIamPolicy
untuk bucket yang relevan.MySQL
Pilih database dan tabel MySQL yang ingin Anda gunakan.
S3
Masukkan URI ke file yang ingin Anda upload, secara relatif terhadap alamat host.
PostgreSQL
Masukkan skema dan nama tabel (atau tampilan) PostgreSQL.
Redshift
Masukkan skema dan nama tabel (atau tampilan) Redshift. Secara default, Redshift menggunakan URL lokasi database yang mengikuti template ini:
cluster-identifier.account-number.aws-region.redshift.amazonaws.com
.sFTP
Masukkan jalur dan nama file, yang diformat sebagai
/PATH/FILENAME.csv
Snowflake
Masukkan database, skema, dan tabel (atau tampilan) Snowflake yang ingin Anda gunakan.
- Pilih set data BigQuery yang akan digunakan sebagai tujuan perantara, lalu klik Berikutnya. Langkah ini memastikan bahwa data Anda telah diformat dengan benar.
- Opsional: Ubah format data Anda. Transformasi mencakup hash compute, pemformatan huruf besar/kecil, dan penggabungan/pemisahan kolom.
- Klik Action > > Transform.
- Di panel yang muncul, klik Tambahkan transformasi atau Tambahkan transformasi lainnya
- Pilih jenis transformasi dari menu dropdown dan masukkan persyaratan.
- Klik Simpan.
- Pilih minimal satu kunci join dan petakan kolom yang akan Anda gunakan. Ads Data Hub akan otomatis memetakan kolom dengan nama yang sama, yang ditunjukkan oleh . Lakukan pengeditan yang diperlukan, lalu klik Berikutnya.
- Tetapkan jadwal:
- Beri nama koneksi Anda.
- Tetapkan frekuensi, yang menentukan seberapa sering data akan diimpor ke dalam set data yang Anda pilih di langkah sebelumnya. Setiap operasi transfer akan menimpa data di tabel tujuan.
- Tentukan cara Anda ingin menangani konflik User-ID. Anda dapat memilih antara mempertahankan kecocokan yang ada atau menimpa dengan data baru.
- Klik Selesai. Tabel kecocokan biasanya siap dikueri 12 jam setelah dibuat.
Melihat detail koneksi
Halaman detail koneksi memberi Anda informasi tentang error dan operasi terbaru koneksi tertentu. Untuk melihat detail koneksi tertentu:
- Klik Koneksi.
- Klik nama koneksi untuk melihat detailnya.
- Sekarang Anda dapat melihat detail koneksi dan operasi terbaru. Masing-masing menampilkan dua
kemungkinan jenis error: error tingkat koneksi (koneksi tidak berjalan) dan
error tingkat baris (baris tidak diimpor).
- Status Gagal menunjukkan bahwa seluruh koneksi gagal dijalankan (misalnya, masalah izin akun layanan). Klik status error untuk melihat error yang memengaruhi koneksi.
- Status Selesai menunjukkan bahwa koneksi berhasil berjalan. Namun, mungkin masih ada error tingkat baris—yang ditunjukkan dengan nilai bukan nol di kolom "Baris dengan error". Klik nilai untuk mempelajari lebih lanjut data yang gagal.
Mengedit koneksi
Detail berikut dapat diedit:
- Nama koneksi
- Jadwal
- Destination table
- Pemetaan Kolom
Mengedit sumber data tidak didukung. Untuk mengubah sumber data, buat koneksi baru dan hapus koneksi lama.
Untuk mengedit detail koneksi:
- Klik Koneksi.
- Klik nama koneksi yang ingin Anda edit.
- Edit detail yang ingin Anda ubah:
- Nama koneksi: Klik Edit, masukkan nama baru, lalu tekan Enter.
- Jadwal: Klik Edit, tetapkan jadwal baru, lalu klik Simpan.
- Tabel tujuan: Klik Edit, masukkan nama tujuan baru, lalu klik Simpan.
- Pemetaan kolom: Klik , buat perubahan pada kolom, lalu klik Simpan.
- Klik .
Membuat kueri data yang cocok
Membuat kueri tabel pencocokan
Jika tabel pencocokan berisi cukup data untuk memenuhi pemeriksaan privasi, Anda sudah siap untuk menjalankan kueri terhadap tabel tersebut.
Tabel asli untuk data pihak pertama (1PD) diwakili oleh my_data
.
Hal ini mencakup Informasi Identitas Pribadi (PII) dan data non-PII.
Menggunakan tabel asli dapat meningkatkan laporan Anda dengan lebih banyak insight, karena mewakili semua data 1PD dalam cakupan, jika dibandingkan dengan tabel pencocokan.
Setiap tabel dalam skema Ads Data Hub yang berisi kolom user_id
disertai dengan tabel pencocokan. Misalnya, untuk
tabel adh.google_ads_impressions
, Ads Data Hub juga membuat tabel pencocokan
yang disebut adh.google_ads_impressions_updm
yang berisi ID pengguna Anda.
Tabel kecocokan terpisah dibuat untuk tabel yang terisolasi kebijakan. Misalnya, untuk
tabel adh.google_ads_impressions_policy_isolated_youtube
, Ads Data Hub
juga membuat tabel pencocokan yang disebut
adh.google_ads_impressions_policy_isolated_youtube_updm
yang berisi
ID pengguna Anda.
Tabel ini berisi subset pengguna yang tersedia di tabel asli,
dengan kecocokan pada user_id
. Misalnya, jika tabel asli
berisi data untuk Pengguna A dan Pengguna B, tetapi hanya Pengguna A yang cocok, Pengguna B
tidak akan ada dalam tabel kecocokan.
Tabel kecocokan berisi kolom tambahan yang disebut customer_data_user_id
, yang
menyimpan ID pengguna sebagai BYTE.
Penting untuk mempertimbangkan jenis kolom saat menulis kueri. Operator perbandingan SQL mengharapkan bahwa literal yang Anda bandingkan memiliki jenis yang sama. Bergantung pada cara user_id
disimpan dalam tabel data pihak pertama, Anda mungkin perlu mengenkode nilai dalam tabel sebelum mencocokkan data.
Anda harus mentransmisikan kunci join ke BYTE agar kecocokan berhasil:
JOIN ON
adh.google_ads_impressions_updm.customer_data_user_id = CAST(my_data.user_id AS BYTES)
Selain itu, perbandingan string dalam SQL peka huruf besar/kecil, sehingga Anda mungkin perlu mengenkode string di kedua sisi perbandingan untuk memastikan bahwa string tersebut dapat dibandingkan secara akurat.
Sampel kueri
Menghitung pengguna yang cocok
Kueri ini menghitung jumlah pengguna yang cocok di tabel tayangan Google Ads Anda.
/* Count matched users in Google Ads impressions table */
SELECT COUNT(DISTINCT user_id)
FROM adh.google_ads_impressions_updm
Menghitung rasio kecocokan
Tidak semua pengguna memenuhi syarat untuk pencocokan. Misalnya, pengguna yang logout,
anak-anak, dan pengguna yang tidak memberikan izin tidak akan dicocokkan melalui UPDM. Anda dapat menggunakan
kolom is_updm_eligible
untuk menghitung rasio kecocokan UPDM yang lebih akurat. Perhatikan bahwa
kolom is_updm_eligible
tersedia mulai 1 Oktober 2024. Anda
tidak dapat menggunakan kolom ini untuk menghitung rasio kecocokan sebelum tanggal tersebut.
/* 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)
Menggabungkan data pihak pertama dan Google Ads
Kueri ini menunjukkan cara menggabungkan data pihak pertama dengan data 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
FAQ UPDM
Untuk daftar FAQ terkait UPDM, lihat FAQ UPDM.