उपयोगकर्ता से मिले डेटा को मैच कराने की सुविधा

उपयोगकर्ता से मिले डेटा को मैच कराने की सुविधा (यूपीडीएम), किसी उपयोगकर्ता के पहले पक्ष (ग्राहक) के इकट्ठा किए गए डेटा को Google के पास मौजूद विज्ञापन डेटा में दिए गए, उसी उपयोगकर्ता की साइन-इन करने की गतिविधि के डेटा से जोड़ती है. इस डेटा में वेबसाइटों, ऐप्लिकेशन या दुकानों से जुड़ी जानकारी शामिल होती है. इसमें Google के पास मौजूद विज्ञापन डेटा शामिल होता है. इसमें Google के मालिकाना हक वाले और उसके ज़रिए मैनेज किए जाने वाले डेटा भी शामिल होते हैं. इसमें Google Marketing Platform (GMP) के प्रॉडक्ट से खरीदा गया डेटा शामिल है. उदाहरण के लिए, Display & Video 360 का इस्तेमाल करके खरीदा गया YouTube डेटा. GMP के ऐसे अन्य प्रॉडक्ट इस्तेमाल नहीं किए जा सकते जो Google के मालिकाना हक वाले नहीं हैं और जिन्हें Google मैनेज नहीं करता.

उपयोगकर्ता से मिले डेटा को मैच कराने की सुविधा का इस्तेमाल करने के लिए यह ज़रूरी है कि विज्ञापन इवेंट, Google के पास मौजूद विज्ञापन डेटा में दिए गए, साइन इन किए हुए उपयोगकर्ता के डेटा से जुड़ा हो.

इस दस्तावेज़ में, उपयोगकर्ता से मिले डेटा को मैच कराने की सुविधा के बारे में बताया गया है. साथ ही, इसे सेट अप करने और इस्तेमाल करने के बारे में दिशा-निर्देश दिए गए हैं.

Private Cloud Match के बारे में खास जानकारी

विज्ञापन से जुड़ी अहम जानकारी पाने के लिए, अक्सर कई सोर्स से डेटा इकट्ठा करना पड़ता है. डेटा पाइपलाइन की इस समस्या को हल करने के लिए, आपको काफ़ी समय और इंजीनियरिंग पर निवेश करना होगा. Private Cloud Match in Ads Data Hub, इस प्रोसेस को आसान बनाता है. इसके लिए, यह BigQuery में मैच टेबल बनाने के लिए, Ads Data Hub क्वेरी टेंप्लेट उपलब्ध कराता है. इसके बाद, इस टेबल का इस्तेमाल Ads Data Hub क्वेरी में किया जा सकता है, ताकि आपके विज्ञापनों के डेटा को पहले पक्ष (ग्राहक) के डेटा से मैच किया जा सके. अपनी क्वेरी को पहले पक्ष (ग्राहक) के डेटा से बेहतर बनाने पर, ग्राहकों को बेहतर अनुभव मिल सकता है. साथ ही, इससे विज्ञापन ट्रैकिंग में होने वाले बदलावों का असर कम होता है.

उपयोगकर्ता से मिले डेटा को मैच कराने की सुविधा, सिर्फ़ Google पर साइन-इन करने वाले उपयोगकर्ताओं को मिलती है. साथ ही, सिर्फ़ उस इन्वेंट्री के लिए मिलती है जिसका मालिक और जिसे चलाने वाला Google है. इसलिए, तीसरे पक्ष की कुकी के काम न करने से इस सुविधा पर कोई असर नहीं पड़ता. इंडस्ट्री में हुए बदलावों का असर, तीसरे पक्ष से मिले डेटा की तुलना में इस सुविधा पर कम पड़ता है. इसलिए, इससे ज़्यादा अहम जानकारी मिल सकती है. इससे ग्राहकों की दिलचस्पी बढ़ सकती है.

प्रोसेस की खास जानकारी

  1. डेटा डालने और मैच करने की सुविधा को सेट अप करना
  2. पहले पक्ष (ग्राहक) के डेटा को शामिल करना और मैच करना
    • आपको पहले पक्ष (ग्राहक) के डेटा को फ़ॉर्मैट करके, अपने BigQuery डेटासेट में अपलोड करना होगा.
    • आप डेटा मैच करने का अनुरोध शुरू करने के लिए, प्राइवेट क्लाउड मैच का विश्लेषण करने वाली क्वेरी बनाएं और शेड्यूल सेट करें.
    • Google आपके प्रोजेक्ट के डेटा को Google के मालिकाना हक वाले डेटा के साथ जोड़ता है. इसमें Google का यूज़र आईडी और उपयोगकर्ता से मिला हैश किया गया डेटा शामिल होता है. इससे मैच टेबल बनाई और अपडेट की जाती हैं.
    • पहले पक्ष (ग्राहक) का डेटा शामिल करना देखें
  3. मैच किए गए डेटा के आधार पर, Ads Data Hub में चल रही क्वेरी

निजता से जुड़ी ज़रूरी शर्तों के बारे में जानकारी

ग्राहक से जुड़ा डेटा इकट्ठा करना

उपयोगकर्ता से मिले डेटा को मैच कराने की सुविधा का इस्तेमाल करते समय, आपको पहले पक्ष का डेटा अपलोड करना होगा. यह जानकारी आपकी वेबसाइटों, ऐप्लिकेशन, दुकानों या ऐसी जगहों से इकट्ठा की जा सकती है जहां ग्राहक आपके कारोबार से सीधे तौर पर इंटरैक्ट करते हैं.

इसलिए, आपको ये करने होंगे:

  • अपनी निजता नीति में यह साफ़ तौर पर बताएं कि ग्राहक से जुड़े डेटा को तीसरे पक्षों के साथ शेयर किया जाता है, ताकि वे आपकी ओर से सेवाएं दे सकें. साथ ही, यह भी बताएं कि जहां भी कानूनी रूप से ज़रूरी हो वहां आपने डेटा शेयर करने के लिए ग्राहक की सहमति ली हो
  • ग्राहक से जुड़ा डेटा अपलोड करने के लिए, ऐसे एपीआई या इंटरफ़ेस का ही इस्तेमाल करें जिसे Google से मंज़ूरी मिली हो
  • लागू होने वाले सभी नियमों और कानूनों का पालन करें. इनमें, खुद तय किए गए या उद्योग से जुड़े नियम भी शामिल हैं

पहले पक्ष (ग्राहक) की सहमति की पुष्टि

Ads Data Hub में पहले पक्ष (ग्राहक) का डेटा इस्तेमाल करने के लिए, आपको यह पुष्टि करनी होगी कि आपने ईईए में रहने वाले असली उपयोगकर्ताओं का डेटा Google के साथ शेयर करने के लिए, उनकी सहमति ली है. यह सहमति, ईयू उपयोगकर्ता की सहमति से जुड़ी नीति और Ads Data Hub की नीति के मुताबिक होनी चाहिए. यह ज़रूरी शर्त, Ads Data Hub के हर खाते पर लागू होती है. साथ ही, जब भी पहले पक्ष का नया डेटा अपलोड किया जाए, तब इसे अपडेट करना ज़रूरी है. पूरे खाते की ओर से कोई भी उपयोगकर्ता इस बात की सहमति दे सकता है.

ध्यान दें कि Google की सेवा से जुड़ी क्वेरी के जो नियम, विश्लेषण से जुड़ी क्वेरी पर लागू होते हैं वे UPDM क्वेरी पर भी लागू होते हैं. उदाहरण के लिए, मैच टेबल बनाते समय, ईईए में मौजूद उपयोगकर्ताओं पर क्रॉस-सर्विस क्वेरी नहीं चलाई जा सकतीं.

Ads Data Hub में सहमति की पुष्टि करने का तरीका जानने के लिए, यूरोपियन इकनॉमिक एरिया के लिए, सहमति लेने से जुड़ी ज़रूरी शर्तें लेख पढ़ें.

डेटा का साइज़

असली उपयोगकर्ता की निजता को सुरक्षित रखने के लिए, उपयोगकर्ता से मिले डेटा को मैच कराने की सुविधा, आपके डेटा के साइज़ से जुड़ी इन ज़रूरी शर्तों को लागू करती है:

  • आपको अपनी उपयोगकर्ता सूची में कम से कम 1,000 रिकॉर्ड अपलोड करने होंगे.

डेटा डालने की सुविधा सेट अप करना

शुरू करने से पहले, पक्का करें कि:

  • पहले पक्ष (ग्राहक) का डेटा, BigQuery में होना चाहिए. अगर आपके पास वीपीसी-एससी पेरीमीटर है, तो पहले पक्ष का यह डेटा आपके वीपीसी-एससी में होना चाहिए.
  • आपके Ads Data Hub सेवा खाते के पास, पहले पक्ष (ग्राहक) के डेटा को पढ़ने का ऐक्सेस होना चाहिए.
  • पहले पक्ष के डेटा को सही तरीके से फ़ॉर्मैट और हैश किया जाना चाहिए. ज़्यादा जानकारी के लिए, अगला सेक्शन देखें.

इसके अलावा, Private Cloud Match में शामिल होने के लिए कोई और प्रोसेस नहीं है. अगर आपके पास विश्लेषण क्वेरी चलाने की अनुमति है, तो आपके पास Private Cloud Match क्वेरी चलाने की अनुमति भी होगी.

पहले पक्ष (ग्राहक) का डेटा शामिल करना और मैच करना

सोर्स की अनुमतियां और कनेक्शन से जुड़ी ज़रूरी शर्तें

Ads Data Hub Connections, सेटिंग > जानकारी > सेवा खाता (आम तौर पर service-<number>@gcp-sa-adsdatahub.iam.gserviceaccount.com) में दिखाए गए सेवा खाते का इस्तेमाल करता है. इसे ये भूमिकाएं दें:

  • BigQuery सोर्स: सोर्स डेटासेट या टेबल पर roles/bigquery.dataViewer (BigQuery डेटा व्यूअर).
  • Cloud Storage सोर्स: सोर्स बकेट या ऑब्जेक्ट पर roles/storage.objectViewer (स्टोरेज ऑब्जेक्ट व्यूअर).
  • पहले पक्ष का डेटा इंपोर्ट करने का डेस्टिनेशन: roles/bigquery.dataEditor अगर टेबल आपके डिफ़ॉल्ट डेटासेट में नहीं है, तो डेस्टिनेशन डेटासेट पर BigQuery डेटा एडिटर की भूमिका.

फ़ील्ड और डेटा टाइप से जुड़ी ज़रूरी शर्तें

  1. उपयोगकर्ता से मिले डेटा को मैच कराने की सुविधा (यूपीडीएम):
    • user_id के साथ-साथ, व्यक्तिगत पहचान से जुड़ी जानकारी वाले कम से कम एक फ़ील्ड को मैप करें. जैसे, email, phone या पूरा पता: first_name, last_name, country, zip_code.
    • user_id, country, और zip_code: सामान्य टेक्स्ट STRING (हैश नहीं किया गया). BigQuery सोर्स के लिए, ये कॉलम पहले से ही STRING होने चाहिए. कनेक्शन बनाते समय, अन्य टाइप (उदाहरण के लिए, INT64) काम नहीं करते. कनेक्शन, मैच टेबल में user_id को BYTES में कास्ट करता है. country दो अक्षरों वाला ISO 3166-1 alpha-2 कोड होना चाहिए.
    • email, phone, first_name, और last_name: HASH—पहले से ही SHA-256 हैश और Base64-कोड में बदला गया होना चाहिए. हालांकि, 64-वर्ण वाली हेक्स SHA-256 वैल्यू भी स्वीकार की जाती है. Connections, डेटा को हैश नहीं करता. कनेक्शन बनाते समय, सादे टेक्स्ट वाली वैल्यू को कैप्चर नहीं किया जाता. इसके बाद, हर रन ... must be encoded using TO_BASE64(SHA256(...)) के साथ फ़ेल हो जाता है.
    • उपयोगकर्ता से मिले डेटा को मैच कराने की सुविधा के कनेक्शन के लिए, कोई डेस्टिनेशन टेबल नहीं है. किसी खाते में मौजूद सभी UPDM क्वेरी और मैन्युअल तरीके से चलाई गई UPDM क्वेरी, मैच किए गए डेटा में ही सेव होती हैं. इसलिए, हर बार क्वेरी चलाने पर, पिछला डेटा बदल जाता है. हर खाते के लिए, एक UPDM कनेक्शन काफ़ी है.
    • हर फ़ील्ड के नियमों के बारे में जानने के लिए, इनपुट के लिए डेटा को फ़ॉर्मैट करना लेख पढ़ें.
  2. पहले पक्ष (ग्राहक) का डेटा इंपोर्ट करना:
    • सिर्फ़ यूज़र इंटरफ़ेस (यूआई) में दिए गए डेटा टाइप का इस्तेमाल करें: INTEGER, STRING, HASH, DOUBLE, DATE, और TIMESTAMP. BigQuery के अन्य टाइप इस्तेमाल नहीं किए जा सकते.
    • BigQuery सोर्स: मैप किया गया टाइप लागू नहीं होता. हर डेस्टिनेशन कॉलम में, उसके सोर्स कॉलम का टाइप ही रहता है.
    • Cloud Storage सोर्स: कॉलम को STRING के तौर पर पढ़ा जाता है और मैप किए गए टाइप में कास्ट किया जाता है. जिन वैल्यू को कास्ट नहीं किया जा सकता वे रन को फ़ेल किए बिना NULL बन जाती हैं.
    • हर बार रन करने पर, डेस्टिनेशन टेबल पूरी तरह से बदल जाती है. इसमें डेटा नहीं जोड़ा जाता. अगर सोर्स में कोई पंक्ति नहीं है, तो डेस्टिनेशन खाली हो जाता है. सोर्स टेबल या ऐसी टेबल जिसका डेटा आपको सेव रखना है उसे डेस्टिनेशन के तौर पर इस्तेमाल न करें.

Cloud Storage CSV कॉलम की ज़रूरी शर्तें

  • हेडर लाइन को शामिल करना. पहली लाइन को छोड़ दिया जाता है. इसके कॉलम के नामों का इस्तेमाल नहीं किया जाता.
  • फ़ाइल में मैप किए गए सोर्स कॉलम ही होने चाहिए. न तो इससे ज़्यादा और न ही इससे कम. अतिरिक्त कॉलम होने पर, रन नहीं किया जा सकता.
  • पहले पक्ष (ग्राहक) का डेटा इंपोर्ट करना: कॉलम उसी क्रम में होने चाहिए जिस क्रम में फ़ील्ड की मैपिंग की गई है.
  • उपयोगकर्ता से मिले डेटा को मैच कराने की सुविधा: कॉलम इसी क्रम में होने चाहिए. साथ ही, सिर्फ़ वे फ़ील्ड रखें जिन्हें आपने मैप किया है: user_id, email, phone, first_name, last_name, country, zip_code. मैपिंग वाली पंक्तियों के क्रम से कोई फ़र्क़ नहीं पड़ता.
  • कॉलम के क्रम में बदलाव का पता नहीं चलता: वैल्यू गलत फ़ील्ड में लोड हो जाती हैं (या मैच रेट कम हो जाते हैं) और कोई गड़बड़ी नहीं दिखती.

इस्तेमाल किए जा सकने वाले डेटा सोर्स और कनेक्शन की सीमाएं

  • डेटा सोर्स: सिर्फ़ BigQuery और Cloud Storage सोर्स का इस्तेमाल किया जा सकता है.
  • BigQuery टेबल के नाम: सोर्स और डेस्टिनेशन BigQuery टेबल के लिए, पूरा project.dataset.table नाम डालना ज़रूरी है.
  • Cloud Storage फ़ाइल पाथ: एक फ़ाइल यूआरआई दें (जैसे, gs://bucket/path/file.csv). * या ? वाले वाइल्डकार्ड पाथ इस्तेमाल नहीं किए जा सकते.
  • कनेक्शन के नाम: खाते में मौजूद हर कनेक्शन का नाम यूनीक होना चाहिए.

इनपुट के लिए डेटा फ़ॉर्मैट करना

सही तरीके से मैच होने के लिए, आपके डेटा को फ़ॉर्मैटिंग से जुड़ी इन ज़रूरी शर्तों को पूरा करना होगा:

  • इनपुट फ़ील्ड की जानकारी में जहां बताया गया है वहां आपको SHA256 हैशिंग का इस्तेमाल करके अपलोड करना होगा.
  • UPDM, Base64 एन्कोडिंग के साथ काम करता है. TO_BASE64 देखें.
  • इनपुट फ़ील्ड, स्ट्रिंग के तौर पर फ़ॉर्मैट किए जाने चाहिए. उदाहरण के लिए, अगर BigQuery SHA256 हैश फ़ंक्शन का इस्तेमाल किया जा रहा है, तो इस ट्रांसफ़ॉर्मेशन का इस्तेमाल करें: TO_BASE64(SHA256(user_data)).

यूज़र आईडी

  • डेटा टाइप: BYTES
  • हैशिंग: कोई नहीं

ईमेल

  • शुरू या आखिर में मौजूद व्हाइटस्पेस हटाएं
  • सभी वर्ण छोटे अक्षरों में लिखें
  • सभी ईमेल पतों के लिए कोई डोमेन नेम डालें. उदाहरण के लिए, gmail.com या hotmail.co.jp
  • उच्चारण चिह्न हटाएं—उदाहरण के लिए, è, é, ê या ë को e में बदलें
  • gmail.com और googlemail.com वाले ईमेल पतों में, डोमेन नेम से पहले आने वाले सभी पीरियड (.) हटा दें
  • हैशिंग: Base64 कोड में बदला गया SHA256

मान्य: TO_BASE64(SHA256("jeffersonloveshiking@gmail.com"))

अमान्य: TO_BASE64(SHA256("JéffersonLôvesHiking@gmail.com"))

फ़ोन

  • खाली सफ़ेद जगह को हटाना
  • E.164 फ़ॉर्मैट में डालें—उदाहरण के लिए, अमेरिका का उदाहरण: +14155552671, यूके का उदाहरण: +442071838750
  • देश के कोड से पहले "+" को छोड़कर, सभी खास वर्ण हटाएं
  • हैशिंग: Base64 कोड में बदला गया SHA256

मान्य: TO_BASE64(SHA256("+18005550101"))

अमान्य: TO_BASE64(SHA256("(800) 555-0101"))

नाम

  • खाली सफ़ेद जगह को हटाना
  • सभी वर्ण छोटे अक्षरों में लिखें
  • सभी प्रीफ़िक्स हटाएं. जैसे, श्रीमती, श्री, सुश्री, डॉ॰
  • उच्चारण चिह्न न हटाएं—उदाहरण के लिए, è, é, ê या ë
  • हैशिंग: Base64 कोड में बदला गया SHA256

मान्य: TO_BASE64(SHA256("daní"))

अमान्य: TO_BASE64(SHA256("Daní"))

उपनाम

  • खाली सफ़ेद जगह को हटाना
  • सभी वर्ण छोटे अक्षरों में लिखें
  • सभी सफ़िक्स हटाएं-उदाहरण के लिए, Jr., सीनियर, 2nd, 3rd, II, III, PHD, MD
  • उच्चारण चिह्न न हटाएं—उदाहरण के लिए, è, é, ê या ë
  • हैशिंग: Base64 कोड में बदला गया SHA256

मान्य: TO_BASE64(SHA256("délacruz"))

अमान्य: TO_BASE64(SHA256("dé la Cruz, Jr."))

देश

  • देश का कोड शामिल करें, भले ही आपके ग्राहकों से जुड़ा पूरा डेटा उसी देश से हो.
  • देश का डेटा हैश न करें
  • ISO 3166-1 alpha-2 देश के कोड इस्तेमाल करें
  • हैशिंग: कोई नहीं

मान्य: US

अमान्य: United States of America या USA

पिन कोड

  • पिन कोड का डेटा हैश न करें
  • अमेरिका के पिन कोड और अंतरराष्ट्रीय पिन कोड, दोनों की अनुमति है
  • अमेरिका के लिए:
    • पांच अंकों के पिन कोड की अनुमति है—उदाहरण के लिए, 94043
    • पांच अंकों के बाद चार अंकों के एक्सटेंशन की भी अनुमति है. उदाहरण के लिए, 94043-1351 या 940431351
  • अन्य सभी देशों के लिए:
    • फ़ॉर्मैटिंग की ज़रूरत नहीं है. जैसे, छोटे अक्षरों का इस्तेमाल करने या स्पेस और खास वर्णों को हटाने की ज़रूरत नहीं है
    • पिन कोड एक्सटेंशन न डालें
  • हैशिंग: कोई नहीं

हैश की पुष्टि और डेटा को कोड में बदलना

यह पक्का करने के लिए कि आपके डेटा का फ़ॉर्मैट सही है, यहां दी गई हैश की पुष्टि करने वाली स्क्रिप्ट का इस्तेमाल किया जा सकता है.

JavaScript

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

  async function hash(token) {
    // Removes leading or trailing spaces and converts all characters to lowercase.
    const formattedToken = token.trim().toLowerCase();
    // Hashes the formatted string using the SHA-256 hashing algorithm.
    const hashBuffer = await crypto.subtle.digest(
        'SHA-256', (new TextEncoder()).encode(formattedToken));
    // Converts the hash buffer to a base64-encoded string and returns it.
    const base64Str = btoa(String.fromCharCode(...new Uint8Array(hashBuffer)));
    return base64Str;
  }

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

    // Expected hash for +18005551212:
    // YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
    hash('+18005551212').then(result => console.log(result));

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

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

  main()

Python

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

  Supports: Python 2, Python 3

  Sample hashes:

    - Email 'test@gmail.com': h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
    - Phone '+18005551212':   YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
    - First name 'John':      ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
    - Last name 'Doe':        eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=
  """

  import base64
  import hashlib

  def hash(token):
  # Generates a base64-encoded SHA-256 hash of a normalized input string.
    return base64.b64encode(
        hashlib.sha256(
            token.strip().lower().encode('utf-8')).digest()).decode('utf-8')

  def print_hash(token, expected=None):
  # Computes and displays the hash of a token, with optional validation.
    hashed = hash(token)

    if expected is not None and hashed != expected:
      print(
          'ERROR: Incorrect hash for token "{}". Expected "{}", got "{}"'.format(
              token, expected, hashed))
      return

    print('Hash: "{}"\t(Token: {})'.format(hashed, token))

  def main():
  # Tests the hash function with sample tokens and expected results.
    print_hash(
        'test@gmail.com', expected='h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=')
    print_hash(
        '+18005551212', expected='YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=')
    print_hash('John', expected='ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=')
    print_hash('Doe', expected='eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=')

  if __name__ == '__main__':
    main()

ऐप पर जाएं

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

  Sample hashes:

    - Email 'test@gmail.com': h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
    - Phone '+18005551212':   YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
    - First name 'John':      ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
    - Last name 'Doe':        eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=
  */
  package main

  import (
    "crypto/sha256"
    "encoding/base64"
    "fmt"
    "strings"
  )

  // Hash hashes an email, phone, first name, or last name into the correct format.
  func Hash(token string) string {
    formatted := strings.TrimSpace(strings.ToLower(token))
    hashed := sha256.Sum256([]byte(formatted))
    encoded := base64.StdEncoding.EncodeToString(hashed[:])
    return encoded
  }

  // PrintHash prints the hash for a token.
  func PrintHash(token string) {
    fmt.Printf("Hash: \"%s\"\t(Token: %s)\n", Hash(token), token)

  }

  func main() {
    PrintHash("test@gmail.com")
    PrintHash("+18005551212")
    PrintHash("John")
    PrintHash("Doe")
  }

Java

  package updm.hashing;

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

  import java.security.MessageDigest;
  import java.security.NoSuchAlgorithmException;
  import java.util.Base64;

  /**
  * Example of the hashing algorithm.
  *
  * <p>Sample hashes:
  *
  * <ul>
  *   <li>Email 'test@gmail.com': h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
  *   <li>Phone '+18005551212': YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
  *   <li>First name 'John': ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
  *   <li>Last name 'Doe': eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=
  * </ul>
  */
  public final class HashExample {

  private HashExample() {}

  public static String hash(String token) {
    // Normalizes and hashes the input token using SHA-256 and Base64 encoding.
    String formattedToken = token.toLowerCase().strip();

    byte[] hash;
    try {
      hash = MessageDigest.getInstance("SHA-256").digest(formattedToken.getBytes(UTF_8));
    } catch (NoSuchAlgorithmException e) {
      throw new IllegalStateException("SHA-256 not supported", e);
    }

    return Base64.getEncoder().encodeToString(hash);
  }

  public static void printHash(String token) {
    // Calculates and prints the hash for the given token.
    System.out.printf("Hash: \"%s\"\t(Token: %s)\n", hash(token), token);
  }

  public static void main(String[] args) {
    // Executes hash calculations and prints results for sample tokens.
    printHash("test@gmail.com");
    printHash("+18005551212");
    printHash("John");
    printHash("Doe");
  }
  }

SQL

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

  The following code uses Google Standard SQL and can be run on BigQuery to generate match tables from unhashed data.

  Sample hashes:

    - Email 'test@gmail.com': h5JGBrQTGorO7q6IaFMfu5cSqqB6XTp1aybOD11spnQ=
    - Phone '+18005551212':   YdkRG+0+bZz8G8O1yzWkAmh8TxVGvuBhor1ET73WTEQ=
    - First name 'John':      ltljLzY1ZMwwMlIUCc8iqFLyAy7sCZ7VlnwNAAzsYHo=
    - Last name 'Doe':        eZ75KhGvkY4/t0HfQpNPO1aO0tk6wd908bjUGieTKm8=

  The unhashed input table schema is assumed to be:

  - Column name: UserID, Type: String
  - Column name: Email, Type: String
  - Column name: Phone, Type: String
  - Column name: FirstName, Type: String
  - Column name: LastName, Type: String
  - Column name: PostalCode, Type: String
  - Column name: CountryCode, Type: String
  */

  -- Creates a new table with Base64-encoded SHA-256 hashes of specified columns.
  CREATE TABLE `your_project_name.your_dataset_name.output_hashed_table_name`
  AS
  SELECT
    UserID,
    TO_BASE64(SHA256(LOWER(Email))) AS Email,
    TO_BASE64(SHA256(Phone)) AS Phone,
    TO_BASE64(SHA256(LOWER(FirstName))) AS FirstName,
    TO_BASE64(SHA256(LOWER(LastName))) AS LastName,
    PostalCode,
    CountryCode,
  FROM
    `your_project_name.your_dataset_name.input_unhashed_table_name`;

जुड़ने की कुंजियां

उपयोगकर्ता से मिले डेटा के कुछ कॉम्बिनेशन, अन्य कॉम्बिनेशन की तुलना में ज़्यादा बेहतर होते हैं. यहां उपयोगकर्ता से मिले डेटा के अलग-अलग कॉम्बिनेशन की सूची दी गई है. इन्हें रिलेटिव स्ट्रेंथ के हिसाब से रैंक किया गया है. अगर पते का इस्तेमाल किया जाता है, तो आपको ये शामिल करने होंगे: नाम, उपनाम, देश, और पिन कोड.

  1. ईमेल, फ़ोन, पता (सबसे मज़बूत)
  2. फ़ोन, पता
  3. ईमेल, पता
  4. ईमेल, फ़ोन
  5. पता
  6. फ़ोन
  7. ईमेल (सबसे कमज़ोर)

मैच टेबल बनाना

  1. add बनाएं > रिपोर्ट पर क्लिक करें.
  2. Private cloud match table generation टेंप्लेट चुनें. ज़रूरी नहीं: अगर आपका डेटा पहले से हैश नहीं किया गया है, तो प्राइवेट क्लाउड मैच टेबल जनरेशन (हैशिंग के साथ) को चुना जा सकता है.
  3. क्वेरी में बदलाव करें पर क्लिक करें. इसके बाद, पैरामीटर के नामों को अपने कॉलम के नामों से बदलें, ताकि सही उपनाम दिया जा सके.
  4. शेड्यूल सेट करें पर क्लिक करके, मैच टेबल को रीफ़्रेश करने की फ़्रीक्वेंसी सेट करें. हर बार रन करने पर, मौजूदा मैच टेबल ओवरराइट हो जाएगी.

मौजूदा कनेक्शन माइग्रेट करना

कनेक्शन टैब में मौजूद कनेक्शन, Ads Data Hub में सीधे तौर पर बनाए गए कनेक्शन के अपडेट किए गए वर्शन पर माइग्रेट हो रहे हैं. अपडेट किए गए कनेक्शन, सेटिंग > जानकारी > सेवा खाता (आम तौर पर service-<number>@gcp-sa-adsdatahub.iam.gserviceaccount.com) में दिखाए गए सेवा खाते का इस्तेमाल करके, सोर्स को पढ़ते हैं और डेस्टिनेशन में डेटा लिखते हैं. ये कनेक्शन, लेगसी Data Fusion, Dataproc, और UPDM सेवा खातों का इस्तेमाल नहीं करते.

अपने कनेक्शन माइग्रेट करने से पहले, ये ऐक्शन आइटम पूरे करें:

  1. सेवा खाते को अनुमतियां दें: सेटिंग > जानकारी > सेवा खाता में दिखने वाले सेवा खाते (आम तौर पर, service-<number>@gcp-sa-adsdatahub.iam.gserviceaccount.com) को सोर्स और डेस्टिनेशन की ज़रूरी भूमिकाएं दें. जैसे, roles/bigquery.dataViewer, roles/storage.objectViewer, और डिफ़ॉल्ट के अलावा अन्य डेस्टिनेशन डेटासेट पर roles/bigquery.dataEditor. ऐसे सोर्स के कनेक्शन अब भी ट्रांसफ़र किए जा सकते हैं जिन्हें पढ़ा नहीं जा सकता, मिटा दिया गया है या जिनमें बदलाव किया गया है. खास तौर पर, Cloud Storage के सोर्स, जिनकी पुष्टि ट्रांसफ़र के समय नहीं की जाती. हालांकि, जब तक ऐक्सेस नहीं दिया जाता या सोर्स को ठीक नहीं किया जाता, तब तक रन नहीं होते.
  2. ऐसे कनेक्शन बदलें जो काम नहीं करते: यहां दिए गए कॉन्फ़िगरेशन वाले कनेक्शन माइग्रेट नहीं किए जाएंगे. उन्हें BigQuery या Cloud Storage के साथ काम करने वाले कनेक्शन में बदलें:
    • अन्य डेटा सोर्स (Amazon S3, Snowflake, MySQL, PostgreSQL, Amazon Redshift, sFTP या Salesforce): पहले BigQuery या Cloud Storage में डेटा को स्टेज करें. इसके बाद, BigQuery या Cloud Storage कनेक्शन बनाएं.
    • काम न करने वाले फ़ील्ड की मैपिंग या डेटा टाइप: फ़ील्ड और डेटा टाइप की ज़रूरी शर्तों को पूरा करने के लिए, कनेक्शन को अपडेट करें या फिर से बनाएं.
    • Cloud Storage के वाइल्डकार्ड पाथ (* या ?): वाइल्डकार्ड यूआरआई को किसी एक फ़ाइल के यूआरआई से बदलें या फ़ाइलों को पहले BigQuery में लोड करें.
    • डुप्लीकेट कनेक्शन के नाम: डुप्लीकेट कनेक्शन का नाम बदलें या उन्हें मिटाएं, ताकि खाते में मौजूद हर कनेक्शन का नाम यूनीक हो.
  3. इस्तेमाल न किए जा रहे कनेक्शन मिटाना: ऐसे पुराने कनेक्शन मिटाएं जिनकी अब आपको ज़रूरत नहीं है.

क्वेरी से मैच होने वाला डेटा

मिलते-जुलते टेबल से क्वेरी करना

जब आपकी मैच टेबल में निजता की जांच के लिए ज़रूरी डेटा मौजूद हो, तब टेबल पर क्वेरी चलाई जा सकती हैं.

पहले पक्ष (ग्राहक) के डेटा (1PD) की ओरिजनल टेबल को my_data से दिखाया जाता है. इसमें व्यक्तिगत पहचान से जुड़ी जानकारी (पीआईआई) और व्यक्तिगत पहचान ज़ाहिर नहीं करने वाली जानकारी (नॉन-पीआईआई), दोनों शामिल हैं. ओरिजनल टेबल का इस्तेमाल करने से, आपकी रिपोर्ट में ज़्यादा अहम जानकारी मिल सकती है. इसकी वजह यह है कि मैच टेबल की तुलना में, ओरिजनल टेबल में स्कोप में मौजूद सारा 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 को सेव करने के तरीके के आधार पर, डेटा मैच करने से पहले आपको टेबल में मौजूद वैल्यू को कोड में बदलना पड़ सकता है. सफल मैच के लिए, आपको अपनी जॉइन कुंजी को BYTES में कास्ट करना होगा:

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

इसके अलावा, एसक्यूएल में स्ट्रिंग की तुलना करते समय, कैपिटल लेटर का ध्यान रखना ज़रूरी है. इसलिए, आपको तुलना के दोनों तरफ़ स्ट्रिंग को एन्कोड करना पड़ सकता है, ताकि उनकी सटीक तुलना की जा सके.

सैंपल क्वेरी

मिलते-जुलते उपयोगकर्ताओं की संख्या

यह क्वेरी, Google Ads इंप्रेशन टेबल में मैच होने वाले उपयोगकर्ताओं की संख्या की गिनती करती है.

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

SELECT COUNT(DISTINCT user_id)
FROM adh.google_ads_impressions_updm

मैच रेट का हिसाब लगाना

सभी उपयोगकर्ताओं को मैचिंग की सुविधा नहीं मिलती. उदाहरण के लिए, साइन आउट कर चुके उपयोगकर्ताओं, बच्चों, और सहमति न देने वाले उपयोगकर्ताओं को यूपीडीएम के ज़रिए मैच नहीं किया जाता. ज़्यादा सटीक यूपीडीएम मैच रेट का हिसाब लगाने के लिए, is_updm_eligible फ़ील्ड का इस्तेमाल किया जा सकता है. ध्यान दें कि 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

यूपीडीएम के बारे में अक्सर पूछे जाने वाले सवाल

यूपीडीएम से जुड़े अक्सर पूछे जाने वाले सवालों की सूची देखने के लिए, यूपीडीएम से जुड़े अक्सर पूछे जाने वाले सवाल पर जाएं.