ব্যবহারকারীর দেওয়া ডেটা মেলানো

ব্যবহারকারীর প্রদান করা ডেটা ম্যাচিং (UPDM) ফিচার, কোনও ব্যবহারকারীর সম্পর্কে আপনার সংগ্রহ করা ফার্স্ট-পার্টি ডেটা—যেমন, আপনার ওয়েবসাইট, অ্যাপ বা ফিজিক্যাল স্টোর থেকে পাওয়া তথ্য—একই ব্যবহারকারীর সাইন-ইন করা অ্যাক্টিভিটির সাথে যোগ করে। এই অ্যাক্টিভিটি সমস্ত Google বিজ্ঞাপন ডেটা জুড়ে থাকে, যার মধ্যে Google-এর মালিকানাধীন ও পরিচালিত ডেটাও অন্তর্ভুক্ত। এর মধ্যে Google Marketing Platform (GMP) প্রোডাক্টের মাধ্যমে কেনা ডেটা অন্তর্ভুক্ত, যেমন, Display & Video 360 ব্যবহার করে কেনা YouTube। Google-এর মালিকানাধীন ও পরিচালিত নয় এমন অন্যান্য GMP প্রোডাক্ট কাজ করে না।

ব্যবহারকারীর দেওয়া ডেটা ম্যাচিংয়ের জন্য উপযুক্ত হতে, বিজ্ঞাপন ইভেন্ট অবশ্যই Google বিজ্ঞাপন ডেটাতে সাইন-ইন করা ব্যবহারকারীর সাথে লিঙ্ক করা থাকতে হবে।

এই ডকুমেন্ট ব্যবহারকারীর প্রদান করা ডেটা ম্যাচিং ফিচার সম্পর্কে বর্ণনা করে এবং সেট-আপ ও ব্যবহারের ব্যাপারে নির্দেশিকা প্রদান করে।

প্রাইভেট ক্লাউড ম্যাচ ওভারভিউ

বিজ্ঞাপন সংক্রান্ত মূল্যবান ইনসাইট পেতে হলে, প্রায়ই একাধিক সোর্স থেকে পাওয়া ডেটা একসাথে জুড়তে হয়। এই ডেটা পাইপলাইন সমস্যার জন্য আপনার নিজস্ব সমাধান তৈরি করতে প্রচুর সময় এবং ইঞ্জিনিয়ারিং বিনিয়োগ প্রয়োজন। Private Cloud Match in Ads Data Hub, BigQuery-তে ম্যাচ টেবিল তৈরি করার জন্য Ads Data Hub কোয়েরি টেমপ্লেট প্রদান করে এই প্রসেসকে স্ট্রিমলাইন করে, যা আপনার ফার্স্ট-পার্টি ডেটার সাথে বিজ্ঞাপন ডেটা ম্যাচ করার জন্য Ads Data Hub কোয়েরিতে ব্যবহার করা যেতে পারে। ফার্স্ট-পার্টি ডেটার মাধ্যমে আপনার কোয়েরি সমৃদ্ধ করলে, তা গ্রাহকদের আরও ভালো অভিজ্ঞতা প্রদান করতে পারে এবং ইন্ডাস্ট্রি-জুড়ে বিজ্ঞাপন-ট্র্যাকিং সংক্রান্ত পরিবর্তনের ক্ষেত্রে আরও বেশি প্রতিরোধক হিসেবে কাজ করে।

যেহেতু ব্যবহারকারীর প্রদান করা ডেটা ম্যাচিং শুধুমাত্র Google-এর মালিকানাধীন এবং সাইন-ইন করা ব্যবহারকারীদের জন্য পরিচালিত ইনভেনটরিতে উপলভ্য, তাই এটি আসন্ন থার্ড-পার্টি কুকি বন্ধ হয়ে যাওয়ার দ্বারা প্রভাবিত হয় না। থার্ড-পার্টি ডেটার তুলনায় এটি ইন্ডাস্ট্রির পরিবর্তনের সাথে আরও বেশি মানিয়ে নিতে পারে, তাই এটি আরও সমৃদ্ধ ইনসাইট প্রদান করতে পারে, যার ফলে গ্রাহকের এনগেজমেন্ট আরও বেশি হতে পারে।

প্রসেসের সারসংক্ষেপ

  1. ডেটা ইনজেশন ও ম্যাচিং সেট-আপ করা
    • আপনি আপনার ফার্স্ট-পার্টি ডেটা BigQuery-তে আছে কিনা এবং আপনার পরিষেবা অ্যাকাউন্টের কাছে এটি পড়ার অ্যাক্সেস আছে কিনা তা নিশ্চিত করুন। ডেটা ইনজেশন সেট-আপ করা দেখুন।
  2. ফার্স্ট-পার্টি ডেটা ইনজেশন ও ম্যাচিং
    • আপনি নিজের ফার্স্ট-পার্টি ডেটা ফর্ম্যাট করে BigQuery ডেটাসেটে আপলোড করেন।
    • আপনি একটি Private Cloud Match analysis কোয়েরি তৈরি করে এবং একটি শিডিউল সেট করে ডেটা-ম্যাচিং অনুরোধ শুরু করেন।
    • ম্যাচ টেবিল তৈরি ও আপডেট করতে, Google আপনার প্রোজেক্ট এবং Google-এর মালিকানাধীন ডেটার মধ্যে ডেটা যোগ করে যার মধ্যে Google-এর ব্যবহারকারীর আইডি এবং ব্যবহারকারীর দেওয়া হ্যাশ করা ডেটা থাকে।
    • ফার্স্ট-পার্টি ডেটা ইনজেস্ট করুন দেখুন
  3. মিলে যাওয়া ডেটার ভিত্তিতে, Ads Data Hub-এ চলমান কোয়েরি
    • Ads Data Hub-এ আপনি যেভাবে নিয়মিত কোয়েরি চালান, ঠিক সেইভাবেই ম্যাচ টেবিলের বিরুদ্ধে আপনি কোয়েরি চালান। কোয়েরি করা ডেটা দেখুন।

গোপনীয়তা বিষয়ক প্রয়োজনীয়তা সম্পর্কে জানুন

গ্রাহক ডেটা সংগ্রহ করা

ব্যবহারকারীর প্রদান করা ডেটা ম্যাচিং ব্যবহার করার সময়, আপনাকে অবশ্যই ফার্স্ট-পার্টি ডেটা আপলোড করতে হবে। এটি আপনার ওয়েবসাইট, অ্যাপ, ফিজিক্যাল স্টোর থেকে সংগ্রহ করা তথ্য বা গ্রাহক সরাসরি আপনার সাথে শেয়ার করেছেন এমন কোনও তথ্য হতে পারে।

আপনাকে অবশ্যই:

  • আপনার তরফ থেকে পরিষেবা প্রদান করার উদ্দেশ্যেই থার্ড-পার্টির সাথে গ্রাহকের ডেটা শেয়ার করা হয় এবং আইনি প্রয়োজন দেখা দিলে, এই ডেটা শেয়ার করার জন্য আপনি গ্রাহকের সম্মতি নিয়ে থাকেন বলে গোপনীয়তা নীতিতে স্পষ্ট উল্লেখ করা আছে কিনা তা নিশ্চিত করুন
  • গ্রাহক ডেটা আপলোড করার জন্য শুধুমাত্র Google-এর অনুমোদিত API বা ইন্টারফেস ব্যবহার করুন
  • প্রযোজ্য হতে পারে এমন যেকোনও সেল্ফ-রেগুলেটরি বা ইন্ডাস্ট্রি কোড সহ প্রযোজ্য আইন ও বিধি মেনে চলুন

ফার্স্ট-পার্টি সম্মতি স্বীকৃতি

Ads Data Hub-এ আপনার ফার্স্ট-পার্টি ডেটা ব্যবহার করতে, আপনাকে অবশ্যই কনফার্ম করতে হবে যে ইউরোপীয় ইউনিয়নের ব্যবহারকারী সম্মতি নীতি এবং Ads Data Hub নীতি অনুযায়ী, আপনি EEA-এর ব্যবহারকারীদের থেকে Google-এর সাথে ডেটা শেয়ার করার জন্য যথাযথ সম্মতি পেয়েছেন। এই প্রয়োজনীয়তা প্রতিটি Ads Data Hub অ্যাকাউন্টের ক্ষেত্রে প্রযোজ্য এবং আপনি যখনই নতুন ফার্স্ট-পার্টি ডেটা আপলোড করবেন, তখনই এটি আপডেট করতে হবে। যেকোনও একজন ব্যবহারকারী সম্পূর্ণ অ্যাকাউন্টের হয়ে এই স্বীকৃতি দিতে পারবেন।

মনে রাখবেন যে, বিশ্লেষণ কোয়েরির ক্ষেত্রে প্রযোজ্য Google পরিষেবার কোয়েরি সংক্রান্ত একই নিয়ম UPDM কোয়েরির ক্ষেত্রেও প্রযোজ্য। যেমন, আপনি ম্যাচ টেবিল তৈরি করার সময় EEA-তে ব্যবহারকারীদের উপর ক্রস-সার্ভিস কোয়েরি চালাতে পারবেন না।

Ads Data Hub-এ কীভাবে সম্মতি স্বীকার করতে হয় তা জানতে, ইউরোপীয় অর্থনৈতিক অঞ্চলের জন্য সম্মতি সংক্রান্ত প্রয়োজনীয়তা দেখুন।

ডেটার সাইজ

ব্যবহারকারীর গোপনীয়তা রক্ষা করতে, ব্যবহারকারীর দেওয়া ডেটা ম্যাচিং আপনার ডেটার সাইজ সংক্রান্ত এইসব প্রয়োজনীয়তা এনফোর্স করে:

  • আপনার ব্যবহারকারীর তালিকায় অন্তত ১,০০০টি রেকর্ড আপলোড করতে হবে।

ডেটা ইনজেশন সেট-আপ করা

শুরু করার আগে, এগুলি নিশ্চিত করুন:

  • আপনার ফার্স্ট-পার্টি ডেটা BigQuery-তে থাকতে হবে। আপনার VPC-SC পেরিমিটার থাকলে, এই ফার্স্ট-পার্টি ডেটা অবশ্যই আপনার VPC-SC-এর মধ্যে থাকতে হবে।
  • আপনার Ads Data Hub পরিষেবা অ্যাকাউন্টে ফার্স্ট-পার্টি ডেটা রিড করার অ্যাক্সেস থাকতে হবে।
  • আপনার ফার্স্ট-পার্টি ডেটা সঠিকভাবে ফর্ম্যাট ও হ্যাশ করা থাকতে হবে। আরও বিবরণের জন্য পরবর্তী বিভাগ দেখুন।

এছাড়া, Private Cloud Match-এর আর কোনও অনবোর্ডিং নেই। আপনি যদি বিশ্লেষণ কোয়েরি চালাতে পারেন, তাহলে আপনি Private Cloud Match কোয়েরি চালাতে পারবেন।

ফার্স্ট-পার্টি ডেটা ইনজেস্ট ও ম্যাচ করা

সোর্স সংক্রান্ত অনুমতি ও কানেকশন সংক্রান্ত প্রয়োজনীয়তা

Ads Data Hub কানেকশন সেটিংস > বিবরণ > পরিষেবা অ্যাকাউন্ট (সাধারণত service-<number>@gcp-sa-adsdatahub.iam.gserviceaccount.com) বিকল্পে দেখানো পরিষেবা অ্যাকাউন্ট ব্যবহার করে। এটিকে এইসব ভূমিকা দিন:

  • BigQuery সোর্স: সোর্স ডেটাসেট বা টেবিলে roles/bigquery.dataViewer (BigQuery ডেটা ভিউয়ার) ভূমিকা।
  • Cloud Storage সোর্স: সোর্স বাকেট বা অবজেক্টে roles/storage.objectViewer (Storage Object Viewer)।
  • ফার্স্ট-পার্টি ডেটা ইমপোর্ট করার ডেস্টিনেশন: roles/bigquery.dataEditor (BigQuery ডেটা এডিটর) ডেস্টিনেশন ডেটাসেটে, যদি টেবিলটি আপনার ডিফল্ট ডেটাসেটে না থাকে।

ফিল্ড ও ডেটার ধরন সংক্রান্ত প্রয়োজনীয়তা

  1. ব্যবহারকারীর প্রদান করা ডেটা ম্যাচিং (UPDM):
    • user_id ম্যাপ করুন এবং সাথে অন্তত একটি PII ফিল্ড (email, phone, অথবা সম্পূর্ণ ঠিকানা: first_name, last_name, country, zip_code)।
    • user_id, country এবং zip_code: প্লেন-টেক্সট STRING (হ্যাশ করা নয়)। BigQuery সোর্সের জন্য, এই কলামগুলি আগে থেকেই STRING হতে হবে; কানেকশন তৈরি করার সময় অন্যান্য ধরনের (যেমন, INT64) কলাম কাজ করে না। ম্যাচ টেবিলে কানেকশন user_id থেকে BYTES-এ কাস্ট করে। country অবশ্যই ২-অক্ষরের ISO 3166-1 আলফা-২ কোড হতে হবে।
    • email, phone, first_name এবং last_name: HASH—অবশ্যই আগে থেকে SHA-256 হ্যাশ করা এবং Base64-এনকোড করা (৬৪-অক্ষরের হেক্স SHA-256 ভ্যালুও গ্রহণ করা হয়)। Connections ডেটা হ্যাশ করে না। কানেকশন তৈরি করার সময় প্লেন-টেক্সট ভ্যালু ধরা পড়ে না; তাই প্রতিবার রান করার সময় ... must be encoded using TO_BASE64(SHA256(...))-এর সাথে ব্যর্থ হয়।
    • ব্যবহারকারীর দেওয়া ডেটা ম্যাচিং কানেকশনে কোনও ডেস্টিনেশন টেবিল নেই। একটি অ্যাকাউন্টে সবগুলি এবং ম্যানুয়ালি চালানো UPDM কোয়েরি একই ম্যাচ ডেটাতে লেখে, তাই প্রতিটি রান আগেরটিকে প্রতিস্থাপন করে। প্রতি অ্যাকাউন্টে একটি UPDM কানেকশনই যথেষ্ট।
    • প্রতিটি ফিল্ডের জন্য নিয়ম জানতে ইনপুটের জন্য ডেটা ফর্ম্যাট করুন দেখুন।
  2. ফার্স্ট-পার্টি ডেটা ইমপোর্ট:
    • UI-তে অফার করা ডেটার ধরনগুলিই শুধু ব্যবহার করুন: INTEGER, STRING, HASH, DOUBLE, DATE এবং TIMESTAMP। অন্যান্য BigQuery-এর ধরন কাজ করে না।
    • BigQuery সোর্স: ম্যাপ করা ধরন প্রয়োগ করা হয়নি; প্রতিটি ডেস্টিনেশন কলাম তার সোর্স কলামের ধরন বজায় রাখে।
    • Cloud Storage সোর্স: কলামগুলি STRING হিসেবে পড়া হয় এবং ম্যাপ করা টাইপে কাস্ট করা হয়। যেসব ভ্যালু কাস্ট করা যায় না সেগুলি রান ব্যর্থ না করেই NULL হয়ে যায়।
    • প্রতিটি রান সম্পূর্ণ ডেস্টিনেশন টেবিলকে প্রতিস্থাপন করে; এটি যোগ করে না। সোর্সে কোনও সারি না থাকলে, গন্তব্য খালি হয়ে যায়। সোর্স টেবিল বা এমন কোনও টেবিল যার ডেটা আপনি রাখতে চান, সেটি ডেস্টিনেশন হিসেবে ব্যবহার করবেন না।

Cloud Storage CSV কলাম সংক্রান্ত প্রয়োজনীয়তা

  • হেডার সারি যোগ করুন। প্রথম লাইনটি এড়িয়ে যাওয়া হয়েছে; এর কলামের নাম ব্যবহার করা হয়নি।
  • ফাইলে ঠিক ম্যাপ করা সোর্স কলাম থাকতে হবে, তার থেকে বেশি বা কম নয়। অতিরিক্ত কলাম থাকলে রান করা যায় না।
  • ফার্স্ট-পার্টি ডেটা ইমপোর্ট: কলামগুলি অবশ্যই ফিল্ড ম্যাপিংয়ের মতো একই ক্রমে থাকতে হবে।
  • ব্যবহারকারীর প্রদান করা ডেটা ম্যাচিং: কলামগুলি অবশ্যই এই ক্রমে থাকতে হবে, শুধুমাত্র আপনার ম্যাপ করা ফিল্ডগুলি রেখে: user_id, email, phone, first_name, last_name, country, zip_code. ম্যাপিং সারির ক্রম গুরুত্বপূর্ণ নয়।
  • কলামের ক্রম আলাদা হলে তা শনাক্ত করা যায় না: কোনও সমস্যা ছাড়াই ভুল ফিল্ডে ভ্যালু লোড হয় (অথবা ম্যাচ রেট কমে যায়)।

কাজ করে এমন ডেটা সোর্স ও কানেকশনের সীমা

  • ডেটা সোর্স: শুধুমাত্র BigQuery এবং Cloud Storage সোর্স কাজ করে।
  • BigQuery টেবিলের নাম: সোর্স ও ডেস্টিনেশন BigQuery টেবিলের সম্পূর্ণ project.dataset.table নাম প্রয়োজন।
  • Cloud Storage ফাইল পাথ: একটি ফাইল URI (যেমন gs://bucket/path/file.csv) প্রদান করুন। * বা ? সহ ওয়াইল্ডকার্ড পাথ কাজ করে না।
  • কানেকশনের নাম: অ্যাকাউন্টে প্রতিটি কানেকশনের একটি অনন্য নাম থাকতে হবে।

ইনপুটের জন্য ডেটা ফর্ম্যাট করুন

সঠিকভাবে ম্যাচ করার জন্য আপনার ডেটা অবশ্যই এইসব ফর্ম্যাটিং সংক্রান্ত প্রয়োজনীয়তা মেনে চলতে হবে:

  • নিম্নলিখিত ইনপুট ফিল্ডের বিবরণে যেখানে উল্লেখ করা আছে, সেখানে আপনাকে SHA256 হ্যাশিং ব্যবহার করে আপলোড করতে হবে।
  • UPDM-এ Base64 এনকোডিং কাজ করে। TO_BASE64 দেখুন।
  • ইনপুট ফিল্ড অবশ্যই স্ট্রিং হিসেবে ফর্ম্যাট করতে হবে। যেমন, আপনি যদি BigQuery SHA256 হ্যাশ ফাংশন ব্যবহার করেন, তাহলে নিম্নলিখিত ট্রান্সফর্মেশন ব্যবহার করুন: TO_BASE64(SHA256(user_data))।

ব্যবহারকারীর আইডি

  • ডেটার ধরন: 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 ফর্ম্যাটে ফর্ম্যাট করুন—যেমন, মার্কিন যুক্তরাষ্ট্রের উদাহরণ: +১৪১৫৫৫৫২৬৭১, যুক্তরাজ্যের উদাহরণ: +৪৪২০৭১৮৩৮৭৫০
  • কান্ট্রি কোডের আগে "+" চিহ্ন ছাড়া সব বিশেষ অক্ষর সরিয়ে দিন
  • হ্যাশিং: Base64 এনকোড করা SHA256

মেয়াদ: TO_BASE64(SHA256("+18005550101"))

ভুল: TO_BASE64(SHA256("(800) 555-0101"))

নাম

  • হোয়াইটস্পেস স্ট্রিপ করুন
  • সব অক্ষর ছোট হাতের করুন
  • সব প্রিফিক্স সরিয়ে দিন-যেমন, শ্রীমতি, শ্রীমান, Ms., ড.
  • অ্যাকসেন্ট সরাবেন না—যেমন, è, é, ê, বা ë
  • হ্যাশিং: Base64 এনকোড করা SHA256

মেয়াদ: TO_BASE64(SHA256("daní"))

ভুল: TO_BASE64(SHA256("Daní"))

পদবি

  • হোয়াইটস্পেস স্ট্রিপ করুন
  • সব অক্ষর ছোট হাতের করুন
  • সব সাফিক্স সরিয়ে দিন-যেমন Jr., Sr., 2nd, 3rd, II, III, PHD, MD
  • অ্যাকসেন্ট সরাবেন না—যেমন, è, é, ê, বা ë
  • হ্যাশিং: Base64 এনকোড করা SHA256

মেয়াদ: TO_BASE64(SHA256("délacruz"))

ভুল: TO_BASE64(SHA256("dé la Cruz, Jr."))

দেশ

  • আপনার সব গ্রাহক ডেটা একই দেশের হলেও দেশের কোড অন্তর্ভুক্ত করুন
  • দেশের ডেটা হ্যাশ করবেন না
  • ISO 3166-1 alpha-2 দেশের কোড ব্যবহার করুন
  • হ্যাশিং: কোনওটিই নয়

মেয়াদ: US

ভুল: United States of America অথবা USA

পিন কোড

  • পিন কোড ডেটা হ্যাশ করবেন না
  • মার্কিন যুক্তরাষ্ট্র এবং আন্তর্জাতিক জিপ ও পোস্টাল কোড, দুটিই ব্যবহার করা যাবে
  • মার্কিন যুক্তরাষ্ট্রের ক্ষেত্রে:
    • ৫ সংখ্যার কোড ব্যবহার করা যাবে—যেমন, ৯৪০৪৩
    • ৫টি সংখ্যার পরে ৪টি সংখ্যার এক্সটেনশনও লেখা যেতে পারে—যেমন, ৯৪০৪৩-১৩৫১ বা ৯৪০৪৩১৩৫১
  • অন্যান্য সব দেশের জন্য:
    • কোনও ফর্ম্যাটিংয়ের প্রয়োজন নেই (ছোট হাতের অক্ষরে পরিবর্তন করা বা স্পেস ও বিশেষ অক্ষর সরানোর প্রয়োজন নেই)
    • পিন কোড এক্সটেনশন বাদ দিন
  • হ্যাশিং: কোনওটিই নয়

হ্যাশ যাচাইকরণ ও ডেটা এনকোডিং

আপনার ডেটা সঠিকভাবে ফর্ম্যাট করা হয়েছে কিনা তা নিশ্চিত করতে আপনি নিম্নলিখিত হ্যাশ যাচাইকরণ স্ক্রিপ্ট ব্যবহার করতে পারেন।

জাভাস্ক্রিপ্ট

  /**
   * @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. যোগ করুন তৈরি করুন > রিপোর্ট বিকল্পে ক্লিক করুন।
  2. প্রাইভেট ক্লাউড ম্যাচ টেবিল জেনারেশন টেমপ্লেট বেছে নিন। ঐচ্ছিক: আপনার ডেটা আগে থেকে হ্যাশ করা না থাকলে, আপনি প্রাইভেট ক্লাউড ম্যাচ টেবিল জেনারেশন (হ্যাশিং সহ) বেছে নিতে পারেন।
  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 ডিফল্ট নয় এমন ডেস্টিনেশন ডেটাসেটে) দিন। পড়া যায় না, মুছে ফেলা হয়েছে বা পরিবর্তন করা হয়েছে এমন সোর্সের সাথে কানেকশন এখনও সরানো হতে পারে (বিশেষ করে ক্লাউড স্টোরেজ সোর্স, যা সরানোর সময় যাচাই করা হয় না), কিন্তু আপনি অ্যাক্সেস না দেওয়া বা সোর্স ঠিক না করা পর্যন্ত রান ব্যর্থ হয়।
  2. কাজ করে না এমন কানেকশন কনভার্ট করুন: নিম্নলিখিত কনফিগারেশন সহ কানেকশন মাইগ্রেট করা হবে না। সেগুলিকে কাজ করে এমন BigQuery বা Cloud Storage কানেকশনে কনভার্ট করুন:
    • অন্যান্য ডেটা সোর্স (Amazon S3, Snowflake, MySQL, PostgreSQL, Amazon Redshift, sFTP, বা Salesforce): প্রথমে BigQuery বা Cloud Storage-এ ডেটা স্টেজ করুন, তারপর BigQuery বা Cloud Storage কানেকশন তৈরি করুন।
    • কাজ করে না এমন ফিল্ড ম্যাপিং বা ডেটার ধরন: ফিল্ড ও ডেটার ধরন সংক্রান্ত প্রয়োজনীয়তা পূরণ করতে কানেকশন আপডেট বা আবার তৈরি করুন।
    • Cloud Storage ওয়াইল্ডকার্ড পাথ (* বা ?): ওয়াইল্ডকার্ড URI-এর পরিবর্তে একটি ফাইল URI ব্যবহার করুন অথবা প্রথমে BigQuery-তে ফাইল লোড করুন।
    • ডুপ্লিকেট কানেকশনের নাম: ডুপ্লিকেট কানেকশনের নাম পরিবর্তন করুন বা মুছে দিন যাতে অ্যাকাউন্টের প্রতিটি কানেকশনের একটি অনন্য নাম থাকে।
  3. অব্যবহৃত কানেকশন মুছে দিন: আপনার আর প্রয়োজন নেই এমন পুরনো কানেকশন মুছে দিন।

কোয়েরি করা ডেটা মিলে গেছে

ম্যাচ টেবিল কোয়েরি করুন

আপনার ম্যাচ টেবিলে গোপনীয়তা চেক করার জন্য পর্যাপ্ত ডেটা থাকলে, আপনি টেবিলের উপর কোয়েরি চালানোর জন্য প্রস্তুত।

ফার্স্ট-পার্টি ডেটার (1PD) আসল টেবিল my_data দ্বারা দেখানো হয়েছে। এর মধ্যে ব্যক্তিগতভাবে শনাক্তকরণযোগ্য তথ্য (PII) এবং PII নয় এমন ডেটা, দুই-ই অন্তর্ভুক্ত। মূল টেবিল ব্যবহার করলে আপনার রিপোর্ট আরও ইনসাইট সহ উন্নত হতে পারে, কারণ এটি ম্যাচ টেবিলের তুলনায় স্কোপে থাকা সমস্ত 1PD ডেটা দেখায়।

Ads Data Hub স্কিমার প্রতিটি টেবিলে user_id ফিল্ড থাকে এবং এর সাথে একটি ম্যাচ টেবিল থাকে। যেমন, adh.google_ads_impressions টেবিলের জন্য, Ads Data Hub একটি ম্যাচ টেবিলও তৈরি করে যার নাম adh.google_ads_impressions_updm এবং এতে আপনার ব্যবহারকারীর আইডি থাকে। নীতি-বিচ্ছিন্ন নেটওয়ার্ক টেবিলের জন্য আলাদা ম্যাচ টেবিল তৈরি করা হয়। যেমন, adh.google_ads_impressions_policy_isolated_network টেবিলের জন্য, Ads Data Hub একটি ম্যাচ টেবিলও তৈরি করে, যার নাম adh.google_ads_impressions_policy_isolated_network_updm, এতে আপনার ব্যবহারকারীর আইডি থাকে।

এইসব টেবিলে আসল টেবিলে উপলভ্য ব্যবহারকারীদের সাবসেট থাকে, যেখানে user_id-এর সাথে ম্যাচ করে। যেমন, আসল টেবিলে যদি ব্যবহারকারী ক ও ব্যবহারকারী খ-এর ডেটা থাকে, কিন্তু শুধু ব্যবহারকারী ক-এর ডেটা ম্যাচ করে, তাহলে ম্যাচ টেবিলে ব্যবহারকারী খ-এর ডেটা থাকবে না।

ম্যাচ টেবিলে customer_data_user_id নামে একটি অতিরিক্ত কলাম থাকে, যা BYTES হিসেবে ইউজার আইডেন্টিফায়ার স্টোর করে।

আপনার কোয়েরি লেখার সময় ফিল্ডের ধরন বিবেচনা করা গুরুত্বপূর্ণ। SQL তুলনাকারী অপারেটর আশা করে যে আপনি যে লিটারেল তুলনা করছেন সেগুলি একই ধরনের। আপনার ফার্স্ট-পার্টি ডেটার টেবিলে user_id কীভাবে স্টোর করা আছে তার উপর নির্ভর করে, ডেটা ম্যাচ করার আগে আপনাকে টেবিলে ভ্যালু এনকোড করতে হতে পারে। সফলভাবে ম্যাচ করার জন্য আপনাকে BYTES-এ আপনার জয়েন কী কাস্ট করতে হবে:

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

এছাড়াও, SQL-এ স্ট্রিং তুলনা করার সময় বড় হাতের ও ছোট হাতের অক্ষরের মধ্যে পার্থক্য করা হয়, তাই আপনাকে তুলনার উভয় পাশে স্ট্রিং এনকোড করতে হতে পারে যাতে সেগুলি সঠিকভাবে তুলনা করা যায়।

নমুনা কোয়েরি

ম্যাচ করা ব্যবহারকারীর সংখ্যা

এই কোয়েরি আপনার Google Ads ইম্প্রেশন টেবিলে মিলে যাওয়া ব্যবহারকারীর সংখ্যা গণনা করে।

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

SELECT COUNT(DISTINCT user_id)
FROM adh.google_ads_impressions_updm

ম্যাচ রেট হিসেব করা

সব ব্যবহারকারী ম্যাচিংয়ের জন্য উপযুক্ত নন। যেমন, সাইন-আউট করা ব্যবহারকারী, বাচ্চা এবং অনুমতি দেননি এমন ব্যবহারকারীদের UPDM-এর মাধ্যমে ম্যাচ করা হয় না। আরও নির্ভুল UPDM ম্যাচ রেট গণনা করতে আপনি is_updm_eligible ফিল্ড ব্যবহার করতে পারবেন। মনে রাখবেন যে is_updm_eligible ফিল্ডটি ১ অক্টোবর, ২০২৪ থেকে উপলভ্য ছিল। আপনি এই তারিখের আগে ম্যাচ রেট গণনা করার জন্য এই ফিল্ড ব্যবহার করতে পারবেন না।

/* Calculate the UPDM match rate */

CREATE TEMP TABLE total_events OPTIONS(privacy_checked_export=TRUE) AS
SELECT
  customer_id,
  COUNT(*) AS n
FROM adh.google_ads_impressions
WHERE is_updm_eligible
GROUP BY 1;

CREATE TEMP TABLE matched_events OPTIONS(privacy_checked_export=TRUE) AS
SELECT
  customer_id,
  COUNT(*) AS n
FROM adh.google_ads_impressions_updm
GROUP BY 1;

SELECT
  customer_id,
  SAFE_DIVIDE(matched_events.n, total_events.n) AS match_rate
FROM total_events
LEFT JOIN matched_events
  USING (customer_id)

ফার্স্ট-পার্টি ও Google Ads ডেটা যোগ করা

এই কোয়েরি থেকে জানা যায় যে কীভাবে Google Ads ডেটার সাথে ফার্স্ট-পার্টি ডেটা যোগ করতে হয়:

/* Join first-party data with Google Ads data. The customer_data_user_id field
contains your ID as BYTES. You need to cast your join key into BYTES for
successful matches. */

SELECT
  inventory_type,
  COUNT(*) AS impressions
FROM
  adh.yt_reserve_impressions_updm AS google_data_imp
LEFT JOIN
  `my_data`
ON
  google_data_imp.customer_data_user_id = CAST(my_data.user_id AS BYTES)
GROUP BY
  inventory_type

UPDM সংক্রান্ত প্রায়শই জিজ্ঞাসিত প্রশ্ন

UPDM সম্পর্কিত প্রায়শই জিজ্ঞাসিত প্রশ্নের তালিকা দেখতে, UPDM সম্পর্কিত প্রায়শই জিজ্ঞাসিত প্রশ্ন দেখুন।