ডেটাপ্লেক্স এবং জেনারেটিভ এআই সহ প্রোগ্রাম্যাটিক ডেটা গুণমান

1. ভূমিকা

এই কোডল্যাব ডেটা অনুশীলনকারীদের জন্য একটি প্রযুক্তিগত ব্লুপ্রিন্ট প্রদান করে। এটি ডেটা গভর্নেন্সের জন্য একটি "কোড-প্রথম" পদ্ধতির রূপরেখা দেয়, কীভাবে দৃঢ় গুণমান এবং মেটাডেটা ব্যবস্থাপনাকে সরাসরি উন্নয়ন জীবনচক্রে এম্বেড করা যায় তা প্রদর্শন করে। এর মূল অংশে, Dataplex Universal Catalog একটি বুদ্ধিমান ডেটা ফ্যাব্রিক হিসাবে কাজ করে, যা সংস্থাগুলিকে তাদের সমগ্র এস্টেট জুড়ে ডেটা লেক থেকে গুদাম পর্যন্ত কেন্দ্রীয়ভাবে পরিচালনা, নিরীক্ষণ এবং পরিচালনা করতে সক্ষম করে।

কোডল্যাব দেখায় কিভাবে Dataplex, BigQuery এবং Gemini CLI-কে জটিল ডেটা সমতল করতে, প্রোগ্রামেটিকভাবে প্রোফাইল করতে, বুদ্ধিমান ডেটা গুণমানের নিয়মের পরামর্শ তৈরি করতে এবং স্বয়ংক্রিয় মানের স্ক্যান স্থাপন করতে হয়। প্রাথমিক উদ্দেশ্য হ'ল ম্যানুয়াল, UI-চালিত প্রক্রিয়াগুলির বাইরে চলে যাওয়া—যা ত্রুটির প্রবণ এবং স্কেল করা কঠিন—এবং পরিবর্তে একটি শক্তিশালী, সংস্করণ-নিয়ন্ত্রণযোগ্য "পলিসি-এ-কোড" কাঠামো প্রতিষ্ঠা করা৷

পূর্বশর্ত

  • Google ক্লাউড কনসোলের একটি প্রাথমিক ধারণা
  • কমান্ড লাইন ইন্টারফেস এবং গুগল ক্লাউড শেলের প্রাথমিক দক্ষতা

আপনি কি শিখবেন

  • ব্যাপক প্রোফাইলিং সক্ষম করতে ম্যাটেরিয়ালাইজড ভিউ ব্যবহার করে নেস্টেড BigQuery ডেটা কীভাবে সমতল করা যায়।
  • ডেটাপ্লেক্স পাইথন ক্লায়েন্ট লাইব্রেরি ব্যবহার করে কীভাবে প্রোগ্রাম্যাটিকভাবে ডেটাপ্লেক্স প্রোফাইল স্ক্যানগুলি ট্রিগার এবং পরিচালনা করবেন।
  • কীভাবে প্রোফাইল ডেটা রপ্তানি করবেন এবং একটি জেনারেটিভ এআই মডেলের জন্য একটি ইনপুট হিসাবে এটি গঠন করবেন।
  • প্রোফাইল ডেটা বিশ্লেষণ করতে এবং একটি Dataplex-compliant YAML নিয়ম ফাইল তৈরি করার জন্য Gemini CLI-এর জন্য কীভাবে একটি প্রম্পট ইঞ্জিনিয়ার করবেন।
  • এআই-জেনারেটেড কনফিগারেশন যাচাই করার জন্য একটি ইন্টারেক্টিভ, হিউম্যান-ইন-দ্য-লুপ (HITL) প্রক্রিয়ার গুরুত্ব।
  • একটি স্বয়ংক্রিয় ডেটা গুণমান স্ক্যান হিসাবে উত্পন্ন নিয়মগুলি কীভাবে স্থাপন করবেন।

আপনি কি প্রয়োজন হবে

  • একটি Google ক্লাউড অ্যাকাউন্ট এবং Google ক্লাউড প্রকল্প
  • একটি ওয়েব ব্রাউজার যেমন ক্রোম

মূল ধারণা: Dataplex ডেটা মানের স্তম্ভ

ডেটাপ্লেক্সের মূল উপাদানগুলি বোঝা একটি কার্যকর ডেটা মানের কৌশল তৈরির জন্য অপরিহার্য।

  • ডেটা প্রোফাইল স্ক্যান: একটি ডেটাপ্লেক্স কাজ যা ডেটা বিশ্লেষণ করে এবং পরিসংখ্যানগত মেটাডেটা তৈরি করে, যার মধ্যে শূন্য শতাংশ, স্বতন্ত্র মান গণনা এবং মান বিতরণ। এটি আমাদের প্রোগ্রামেটিক "আবিষ্কার" পর্ব হিসাবে কাজ করে।
  • ডেটা গুণমানের নিয়ম: আপনার ডেটা অবশ্যই পূরণ করতে হবে এমন শর্তগুলিকে সংজ্ঞায়িত করে ঘোষণামূলক বিবৃতি (যেমন, NonNullExpectation , SetExpectation , RangeExpectation )।
  • নিয়ম সাজেশনের জন্য জেনারেটিভ এআই: একটি ডাটা প্রোফাইল বিশ্লেষণ করতে এবং প্রাসঙ্গিক ডেটা মানের নিয়মের পরামর্শ দিতে একটি বৃহৎ ভাষার মডেল (যেমন মিথুন) ব্যবহার করে। এটি একটি বেসলাইন মানের কাঠামো সংজ্ঞায়িত করার প্রক্রিয়াকে ত্বরান্বিত করে।
  • ডেটা কোয়ালিটি স্ক্যান: একটি ডেটাপ্লেক্স কাজ যা পূর্বনির্ধারিত বা কাস্টম নিয়মগুলির একটি সেটের বিরুদ্ধে ডেটা যাচাই করে।
  • প্রোগ্রাম্যাটিক গভর্ন্যান্স: কোড হিসাবে গভর্নেন্স নিয়ন্ত্রণ (যেমন মানের নিয়ম) পরিচালনার কেন্দ্রীয় থিম (যেমন, YAML ফাইল এবং পাইথন স্ক্রিপ্টগুলিতে)। এটি সিআই/সিডি পাইপলাইনে অটোমেশন, সংস্করণ এবং একীকরণ সক্ষম করে।
  • হিউম্যান-ইন-দ্য-লুপ (HITL): একটি স্বয়ংক্রিয় কর্মপ্রবাহে মানুষের দক্ষতা এবং তদারকিকে একীভূত করার গুরুত্বপূর্ণ নিয়ন্ত্রণ বিন্দু। AI-উত্পাদিত কনফিগারেশনের জন্য, HITL স্থাপনের আগে পরামর্শগুলির সঠিকতা, ব্যবসায়িক প্রাসঙ্গিকতা এবং নিরাপত্তা যাচাই করার জন্য অপরিহার্য।

2. সেটআপ এবং প্রয়োজনীয়তা

ক্লাউড শেল শুরু করুন

যদিও Google ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালিত হতে পারে, এই কোডল্যাবে আপনি Google ক্লাউড শেল ব্যবহার করবেন, একটি কমান্ড লাইন পরিবেশ যা ক্লাউডে চলছে।

Google ক্লাউড কনসোল থেকে, উপরের ডানদিকে টুলবারে ক্লাউড শেল আইকনে ক্লিক করুন:

55efc1aaa7a4d3ad.png

পরিবেশের ব্যবস্থা করতে এবং সংযোগ করতে এটি শুধুমাত্র কয়েক মুহূর্ত নিতে হবে। এটি সমাপ্ত হলে, আপনি এই মত কিছু দেখতে হবে:

7ffe5cbb04455448.png

এই ভার্চুয়াল মেশিনটি আপনার প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুল দিয়ে লোড করা হয়েছে। এটি একটি ক্রমাগত 5GB হোম ডিরেক্টরি অফার করে এবং Google ক্লাউডে চলে, যা নেটওয়ার্ক কর্মক্ষমতা এবং প্রমাণীকরণকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার সমস্ত কাজ একটি ব্রাউজারে করা যেতে পারে। আপনার কিছু ইন্সটল করার দরকার নেই।

প্রয়োজনীয় API সক্রিয় করুন এবং পরিবেশ কনফিগার করুন

ক্লাউড শেলের ভিতরে, নিশ্চিত করুন যে আপনার প্রকল্প আইডি সেটআপ করা আছে:

export PROJECT_ID=$(gcloud config get-value project)
gcloud config set project $PROJECT_ID
export LOCATION="us-central1"
export BQ_LOCATION="us"
export DATASET_ID="dataplex_dq_codelab"
export TABLE_ID="ga4_transactions"

gcloud services enable dataplex.googleapis.com \
                       bigquery.googleapis.com \
                       serviceusage.googleapis.com

উদাহরণে আমরা us (মাল্টি-অঞ্চল) অবস্থান হিসাবে ব্যবহার করছি যেহেতু আমরা যে পাবলিক নমুনা ডেটা ব্যবহার করব তাও us (মাল্টি-অঞ্চল) মধ্যে অবস্থিত। BigQuery-এর জন্য প্রয়োজন যে উৎস ডেটা এবং একটি কোয়েরির জন্য গন্তব্য টেবিল একই অবস্থানে থাকে।

একটি ডেডিকেটেড BigQuery ডেটাসেট তৈরি করুন

আমাদের নমুনা ডেটা এবং ফলাফল রাখার জন্য একটি নতুন BigQuery ডেটাসেট তৈরি করুন।

bq --location=us mk --dataset $PROJECT_ID:$DATASET_ID

নমুনা ডেটা প্রস্তুত করুন

এই কোডল্যাবের জন্য, আপনি Google মার্চেন্ডাইজ স্টোর থেকে অস্পষ্ট ই-কমার্স ডেটা সহ একটি সর্বজনীন ডেটাসেট ব্যবহার করবেন৷ যেহেতু পাবলিক ডেটাসেটগুলি শুধুমাত্র পঠনযোগ্য, তাই আপনাকে অবশ্যই আপনার নিজের ডেটাসেটে একটি পরিবর্তনযোগ্য অনুলিপি তৈরি করতে হবে৷ নিম্নলিখিত bq কমান্ডটি আপনার dataplex_dq_codelab ডেটাসেটে একটি নতুন টেবিল, ga4_transactions তৈরি করে। স্ক্যানগুলি দ্রুত চালানো নিশ্চিত করতে এটি একটি একক দিনের (2021-01-31) ডেটা কপি করে।

bq query \
--use_legacy_sql=false \
--destination_table=$PROJECT_ID:$DATASET_ID.$TABLE_ID \
--replace=true \
'SELECT * FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_20210131`'

ডেমো ডিরেক্টরি সেটআপ করুন

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

git clone https://github.com/GoogleCloudPlatform/devrel-demos
cd devrel-demos/data-analytics/programmatic-dq

এই ডিরেক্টরিটি এখন আপনার সক্রিয় কর্মক্ষেত্র। পরবর্তী সমস্ত ফাইল এখানে তৈরি করা হবে।

3. Dataplex প্রোফাইলিং সহ স্বয়ংক্রিয় ডেটা আবিষ্কার

Dataplex ডেটা প্রোফাইলিং হল একটি শক্তিশালী টুল যা স্বয়ংক্রিয়ভাবে আপনার ডেটা সম্পর্কে পরিসংখ্যানগত তথ্য আবিষ্কার করার জন্য, যেমন শূন্য শতাংশ, স্বতন্ত্রতা এবং মান বিতরণ। আপনার ডেটার গঠন এবং গুণমান বোঝার জন্য এই প্রক্রিয়াটি অপরিহার্য। যাইহোক, ডেটাপ্লেক্স প্রোফাইলিংয়ের একটি পরিচিত সীমাবদ্ধতা হল একটি টেবিলের মধ্যে নেস্টেড বা পুনরাবৃত্তি ক্ষেত্রগুলি (যেমন, RECORD বা ARRAY প্রকারগুলি) সম্পূর্ণরূপে পরিদর্শন করতে অক্ষমতা। এটি সনাক্ত করতে পারে যে একটি কলাম একটি জটিল প্রকার কিন্তু সেই নেস্টেড কাঠামোর মধ্যে পৃথক ক্ষেত্রগুলি প্রোফাইল করতে পারে না।

এটি কাটিয়ে ওঠার জন্য, আমরা উদ্দেশ্য-নির্মিত বস্তুগত দৃশ্যগুলিতে ডেটা সমতল করব। এই কৌশলটি প্রতিটি ক্ষেত্রকে একটি শীর্ষ-স্তরের কলামে পরিণত করে, Dataplex প্রতিটিকে পৃথকভাবে প্রোফাইল করতে সক্ষম করে।

নেস্টেড স্কিমা বোঝা

প্রথমে আমাদের সোর্স টেবিলের স্কিমা পরীক্ষা করা যাক। Google Analytics 4 (GA4) ডেটাসেটে বেশ কয়েকটি নেস্ট করা এবং পুনরাবৃত্তি করা কলাম রয়েছে৷ সমস্ত নেস্টেড স্ট্রাকচার সহ প্রোগ্রাম্যাটিকভাবে সম্পূর্ণ স্কিমা পুনরুদ্ধার করতে, আপনি bq show কমান্ডটি ব্যবহার করতে পারেন এবং JSON ফাইল হিসাবে আউটপুট সংরক্ষণ করতে পারেন।

bq show --schema --format=json $PROJECT_ID:$DATASET_ID.$TABLE_ID > bq_schema.json

bq_schema.json ফাইলটি পরিদর্শন করা ডিভাইস, জিও, ইকমার্স এবং বারবার রেকর্ড আইটেমের মতো জটিল কাঠামো প্রকাশ করে। এগুলি এমন কাঠামো যা কার্যকরী প্রোফাইলিংয়ের জন্য সমতলকরণের প্রয়োজন।

ম্যাটেরিয়ালাইজড ভিউ সহ ডেটা চ্যাপ্টা করা

ম্যাটেরিয়ালাইজড ভিউ (MVs) তৈরি করা এই নেস্টেড ডেটা চ্যালেঞ্জের সবচেয়ে কার্যকর এবং ব্যবহারিক সমাধান। সমতল ফলাফলগুলি প্রাক-গণনা করে, MV গুলি বিশ্লেষক এবং প্রোফাইলিং সরঞ্জামগুলির জন্য একটি সরল, সম্পর্কীয়-সদৃশ কাঠামো প্রদান করে, কোয়েরির কার্যকারিতা এবং খরচের ক্ষেত্রে উল্লেখযোগ্য সুবিধা প্রদান করে।

স্বাভাবিক প্রথম চিন্তা হতে পারে সবকিছুকে একক, বিশাল দৃশ্যে সমতল করা। যাইহোক, এই স্বজ্ঞাত পদ্ধতি একটি বিপজ্জনক ফাঁদ লুকিয়ে রাখে যা গুরুতর ডেটা দুর্নীতির দিকে নিয়ে যেতে পারে। আসুন জেনে নেই কেন এটি একটি গুরুতর ভুল।

  1. mv_ga4_user_session_flat.sql
CREATE OR REPLACE MATERIALIZED VIEW `$PROJECT_ID.$DATASET_ID.mv_ga4_user_session_flat`
OPTIONS (
  enable_refresh = true,
  refresh_interval_minutes = 30
) AS
SELECT
  event_date, event_timestamp, event_name, user_pseudo_id, user_id, stream_id, platform,
  device.category AS device_category,
  device.operating_system AS device_os,
  device.operating_system_version AS device_os_version,
  device.language AS device_language,
  device.web_info.browser AS device_browser,
  geo.continent AS geo_continent,
  geo.country AS geo_country,
  geo.region AS geo_region,
  geo.city AS geo_city,
  traffic_source.name AS traffic_source_name,
  traffic_source.medium AS traffic_source_medium,
  traffic_source.source AS traffic_source_source
FROM
  `$PROJECT_ID.$DATASET_ID.ga4_transactions`;
  1. mv_ga4_ecommerce_transactions.sql
CREATE OR REPLACE MATERIALIZED VIEW `$PROJECT_ID.$DATASET_ID.mv_ga4_ecommerce_transactions`
OPTIONS (
  enable_refresh = true,
  refresh_interval_minutes = 30
) AS
SELECT
  event_date, event_timestamp, user_pseudo_id, ecommerce.transaction_id,
  ecommerce.total_item_quantity,
  ecommerce.purchase_revenue_in_usd,
  ecommerce.purchase_revenue,
  ecommerce.refund_value_in_usd,
  ecommerce.refund_value,
  ecommerce.shipping_value_in_usd,
  ecommerce.shipping_value,
  ecommerce.tax_value_in_usd,
  ecommerce.tax_value,
  ecommerce.unique_items
FROM
  `$PROJECT_ID.$DATASET_ID.ga4_transactions`
WHERE
  ecommerce.transaction_id IS NOT NULL;
  1. mv_ga4_ecommerce_items.sql
CREATE OR REPLACE MATERIALIZED VIEW `$PROJECT_ID.$DATASET_ID.mv_ga4_ecommerce_items`
OPTIONS (
  enable_refresh = true,
  refresh_interval_minutes = 30
) AS
SELECT
  event_date, event_timestamp, event_name, user_pseudo_id, ecommerce.transaction_id,
  item.item_id,
  item.item_name,
  item.item_brand,
  item.item_variant,
  item.item_category,
  item.item_category2,
  item.item_category3,
  item.item_category4,
  item.item_category5,
  item.price_in_usd,
  item.price,
  item.quantity,
  item.item_revenue_in_usd,
  item.item_revenue,
  item.coupon,
  item.affiliation,
  item.item_list_name,
  item.promotion_name
FROM
  `$PROJECT_ID.$DATASET_ID.ga4_transactions`,
  UNNEST(items) AS item
WHERE
  ecommerce.transaction_id IS NOT NULL;

এখন, bq কমান্ড-লাইন টুল ব্যবহার করে এই টেমপ্লেটগুলি চালান। envsubst কমান্ড প্রতিটি ফাইল পড়বে, $PROJECT_ID এবং $DATASET_ID এর মতো ভেরিয়েবলগুলিকে আপনার শেল পরিবেশ থেকে তাদের মান দিয়ে প্রতিস্থাপন করবে এবং bq ক্যোয়ারী কমান্ডে চূড়ান্ত, বৈধ SQL পাইপ করবে।

envsubst < mv_ga4_user_session_flat.sql | bq query --use_legacy_sql=false
envsubst < mv_ga4_ecommerce_transactions.sql | bq query --use_legacy_sql=false
envsubst < mv_ga4_ecommerce_items.sql | bq query --use_legacy_sql=false

পাইথন ক্লায়েন্টের মাধ্যমে প্রোফাইল স্ক্যানগুলি চালান

এখন যেহেতু আমাদের সমতল, প্রোফাইলেবল ভিউ আছে, আমরা প্রত্যেকের জন্য প্রোগ্রাম্যাটিকভাবে ডেটাপ্লেক্স ডেটা প্রোফাইল স্ক্যান তৈরি এবং চালাতে পারি। নিম্নলিখিত পাইথন স্ক্রিপ্টটি এই প্রক্রিয়াটিকে স্বয়ংক্রিয় করতে google-cloud-dataplex ক্লায়েন্ট লাইব্রেরি ব্যবহার করে।

স্ক্রিপ্ট চালানোর আগে, আপনার প্রকল্প ডিরেক্টরির মধ্যে একটি বিচ্ছিন্ন পাইথন পরিবেশ তৈরি করা একটি গুরুত্বপূর্ণ সেরা অনুশীলন। এটি আপনার ক্লাউড শেল পরিবেশে অন্যান্য প্যাকেজগুলির সাথে দ্বন্দ্ব প্রতিরোধ করে, প্রকল্পের নির্ভরতাগুলি আলাদাভাবে পরিচালিত হয় তা নিশ্চিত করে৷

# Create the virtual environment
python3 -m venv dq_venv

# Activate the environment
source dq_venv/bin/activate

এখন, নতুন সক্রিয় পরিবেশের ভিতরে Dataplex ক্লায়েন্ট লাইব্রেরি ইনস্টল করুন।

# Install the Dataplex client library
pip install google-cloud-dataplex

পরিবেশ সেট আপ এবং লাইব্রেরি ইনস্টল করার সাথে, আপনি অর্কেস্ট্রেশন স্ক্রিপ্ট তৈরি করতে প্রস্তুত।

ক্লাউড শেল টুলবারে, সম্পাদক খুলুন ক্লিক করুন। 1_run_dataplex_scans.py নামে একটি নতুন ফাইল তৈরি করুন এবং এতে নিম্নলিখিত পাইথন কোডটি পেস্ট করুন। আপনি যদি GitHub সংগ্রহস্থল ক্লোন করেন তবে এই ফাইলটি ইতিমধ্যে আপনার ফোল্ডারে রয়েছে।

এই স্ক্রিপ্টটি প্রতিটি বস্তুগত দৃশ্যের জন্য একটি স্ক্যান তৈরি করবে (যদি এটি ইতিমধ্যেই বিদ্যমান না থাকে), স্ক্যানটি চালান এবং তারপরে সমস্ত স্ক্যান কাজ সম্পূর্ণ না হওয়া পর্যন্ত পোল করুন৷

import os
import sys
import time
from google.cloud import dataplex_v1
from google.api_core.exceptions import AlreadyExists


def create_and_run_scan(
    client: dataplex_v1.DataScanServiceClient,
    project_id: str,
    location: str,
    data_scan_id: str,
    target_resource: str,
) -> dataplex_v1.DataScanJob | None:
    """
    Creates and runs a single data profile scan.
    Returns the executed Job object without waiting for completion.
    """
    parent = client.data_scan_path(project_id, location, data_scan_id).rsplit('/', 2)[0]
    scan_path = client.data_scan_path(project_id, location, data_scan_id)

    # 1. Create Data Scan (skips if it already exists)
    try:
        data_scan = dataplex_v1.DataScan()
        data_scan.data.resource = target_resource
        data_scan.data_profile_spec = dataplex_v1.DataProfileSpec()

        print(f"[INFO] Creating data scan '{data_scan_id}'...")
        client.create_data_scan(
            parent=parent,
            data_scan=data_scan,
            data_scan_id=data_scan_id
        ).result()  # Wait for creation to complete
        print(f"[SUCCESS] Data scan '{data_scan_id}' created.")
    except AlreadyExists:
        print(f"[INFO] Data scan '{data_scan_id}' already exists. Skipping creation.")
    except Exception as e:
        print(f"[ERROR] Error creating data scan '{data_scan_id}': {e}")
        return None

    # 2. Run Data Scan
    try:
        print(f"[INFO] Running data scan '{data_scan_id}'...")
        run_response = client.run_data_scan(name=scan_path)
        print(f"[SUCCESS] Job started for '{data_scan_id}'. Job ID: {run_response.job.name.split('/')[-1]}")
        return run_response.job
    except Exception as e:
        print(f"[ERROR] Error running data scan '{data_scan_id}': {e}")
        return None


def main():
    """Main execution function"""
    # --- Load configuration from environment variables ---
    PROJECT_ID = os.environ.get("PROJECT_ID")
    LOCATION = os.environ.get("LOCATION")
    DATASET_ID = os.environ.get("DATASET_ID")

    if not all([PROJECT_ID, LOCATION, DATASET_ID]):
        print("[ERROR] One or more required environment variables are not set.")
        print("Please ensure PROJECT_ID, LOCATION, and DATASET_ID are exported in your shell.")
        sys.exit(1)

    print(f"[INFO] Using Project: {PROJECT_ID}, Location: {LOCATION}, Dataset: {DATASET_ID}")

    # List of Materialized Views to profile
    TARGET_VIEWS = [
        "mv_ga4_user_session_flat",
        "mv_ga4_ecommerce_transactions",
        "mv_ga4_ecommerce_items"
    ]
    # ----------------------------------------------------

    client = dataplex_v1.DataScanServiceClient()
    running_jobs = []

    # 1. Create and run jobs for all target views
    print("\n--- Starting Data Profiling Job Creation and Execution ---")
    for view_name in TARGET_VIEWS:
        data_scan_id = f"profile-scan-{view_name.replace('_', '-')}"
        target_resource = f"//bigquery.googleapis.com/projects/{PROJECT_ID}/datasets/{DATASET_ID}/tables/{view_name}"

        job = create_and_run_scan(client, PROJECT_ID, LOCATION, data_scan_id, target_resource)
        if job:
            running_jobs.append(job)
    print("-------------------------------------------------------\n")

    if not running_jobs:
        print("[ERROR] No jobs were started. Exiting.")
        return

    # 2. Poll for all jobs to complete
    print("--- Monitoring job completion status (checking every 30 seconds) ---")
    completed_jobs = {}

    while running_jobs:
        jobs_to_poll_next = []

        print(f"\n[STATUS] Checking status for {len(running_jobs)} running jobs...")

        for job in running_jobs:
            job_id_short = job.name.split('/')[-1][:13] 
            try:
                updated_job = client.get_data_scan_job(name=job.name)
                state = updated_job.state

                if state in (dataplex_v1.DataScanJob.State.RUNNING, dataplex_v1.DataScanJob.State.PENDING, dataplex_v1.DataScanJob.State.CANCELING):
                    print(f"  - Job {job_id_short}... Status: {state.name}")
                    jobs_to_poll_next.append(updated_job) 
                else:
                    print(f"  - Job {job_id_short}... Status: {state.name} (Complete)")
                    completed_jobs[job.name] = updated_job

            except Exception as e:
                print(f"[ERROR] Could not check status for job {job_id_short}: {e}")

        running_jobs = jobs_to_poll_next

        if running_jobs:
            time.sleep(30)

    # 3. Print final results
    print("\n--------------------------------------------------")
    print("[SUCCESS] All data profiling jobs have completed.")
    print("\nFinal Job Status Summary:")
    for job_name, job in completed_jobs.items():
        job_id_short = job_name.split('/')[-1][:13]
        print(f"  - Job {job_id_short}: {job.state.name}")
        if job.state == dataplex_v1.DataScanJob.State.FAILED:
            print(f"    - Failure Message: {job.message}")

    print("\nNext step: Analyze the profile results and generate quality rules.")


if __name__ == "__main__":
    main()

এখন, আপনার ক্লাউড শেল টার্মিনাল থেকে স্ক্রিপ্টটি চালান।

python 1_run_dataplex_scans.py

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

আপনি Google ক্লাউড কনসোলে সম্পূর্ণ প্রোফাইল স্ক্যান দেখতে পারেন।

  1. নেভিগেশন মেনুতে, গভর্ন বিভাগে ডাটাপ্লেক্স ইউনিভার্সাল ক্যাটালগ এবং প্রোফাইলে যান।

5acda859404968c.png

  1. আপনি তালিকাভুক্ত আপনার তিনটি প্রোফাইল স্ক্যান দেখতে পাবেন, তাদের সর্বশেষ চাকরির স্থিতি সহ। আপনি বিস্তারিত ফলাফল দেখতে একটি স্ক্যান ক্লিক করতে পারেন.

8a09dae0ef485289.png

BigQuery প্রোফাইল থেকে AI-রেডি ইনপুট

Dataplex প্রোফাইল স্ক্যান সফলভাবে চালানো হয়েছে. ফলাফলগুলি ডেটাপ্লেক্স এপিআই-এর মধ্যে পাওয়া গেলে, একটি জেনারেটিভ এআই মডেলের জন্য ইনপুট হিসাবে ব্যবহার করার জন্য, আমাদের একটি কাঠামোগত, স্থানীয় ফাইলে সেগুলি বের করতে হবে।

নিম্নলিখিত Python স্ক্রিপ্ট, 2_dq_profile_save.py , প্রোগ্রাম্যাটিকভাবে আমাদের mv_ga4_user_session_flat ভিউয়ের জন্য সর্বশেষ সফল প্রোফাইল স্ক্যান কাজ খুঁজে পায়। এটি তারপর সম্পূর্ণ, বিস্তারিত প্রোফাইল ফলাফল পুনরুদ্ধার করে এবং dq_profile_results.json নামে একটি স্থানীয় JSON ফাইল হিসাবে সংরক্ষণ করে। এই ফাইলটি পরবর্তী ধাপে আমাদের AI বিশ্লেষণের জন্য সরাসরি ইনপুট হিসেবে কাজ করবে।

আপনার ক্লাউড শেল এডিটরে, 2_dq_profile_save.py নামে একটি নতুন ফাইল তৈরি করুন এবং এতে নিম্নলিখিত কোডটি পেস্ট করুন। আগের ধাপের মতোই, আপনি যদি সংগ্রহস্থলটি ক্লোন করেন তবে আপনি একটি ফাইল তৈরি করা এড়িয়ে যেতে পারেন।

import os
import sys
import json
from google.cloud import dataplex_v1
from google.api_core.exceptions import NotFound
from google.protobuf.json_format import MessageToDict

# --- Configuration ---
# The Materialized View to analyze is fixed for this step.
TARGET_VIEW = "mv_ga4_user_session_flat"
OUTPUT_FILENAME = "dq_profile_results.json"


def save_to_json_file(content: dict, filename: str):
    """Saves the given dictionary content to a JSON file."""
    try:
        with open(filename, "w", encoding="utf-8") as f:
            # Use indent=2 for a readable, "pretty-printed" JSON file.
            json.dump(content, f, indent=2, ensure_ascii=False)
        print(f"\n[SUCCESS] Profile results were saved to '{filename}'.")
    except (IOError, TypeError) as e:
        print(f"[ERROR] An error occurred while saving the file: {e}")


def get_latest_successful_job(
    client: dataplex_v1.DataScanServiceClient,
    project_id: str,
    location: str,
    data_scan_id: str
) -> dataplex_v1.DataScanJob | None:
    """Finds and returns the most recently succeeded job for a given data scan."""
    scan_path = client.data_scan_path(project_id, location, data_scan_id)
    print(f"\n[INFO] Looking for the latest successful job for scan '{data_scan_id}'...")

    try:
        # List all jobs for the specified scan, which are ordered most-recent first.
        jobs_pager = client.list_data_scan_jobs(parent=scan_path)

        # Iterate through jobs to find the first one that succeeded.
        for job in jobs_pager:
            if job.state == dataplex_v1.DataScanJob.State.SUCCEEDED:
                return job

        # If no successful job is found after checking all pages.
        return None
    except NotFound:
        print(f"[WARN] No scan history found for '{data_scan_id}'.")
        return None


def main():
    """Main execution function."""
    # --- Load configuration from environment variables ---
    PROJECT_ID = os.environ.get("PROJECT_ID")
    LOCATION = os.environ.get("LOCATION")

    if not all([PROJECT_ID, LOCATION]):
        print("[ERROR] Required environment variables PROJECT_ID or LOCATION are not set.")
        sys.exit(1)

    print(f"[INFO] Using Project: {PROJECT_ID}, Location: {LOCATION}")
    print(f"--- Starting Profile Retrieval for: {TARGET_VIEW} ---")

    # Construct the data_scan_id based on the target view name.
    data_scan_id = f"profile-scan-{TARGET_VIEW.replace('_', '-')}"

    # 1. Initialize Dataplex client and get the latest successful job.
    client = dataplex_v1.DataScanServiceClient()
    latest_job = get_latest_successful_job(client, PROJECT_ID, LOCATION, data_scan_id)

    if not latest_job:
        print(f"\n[ERROR] No successful job record was found for '{data_scan_id}'.")
        print("Please ensure the 'run_dataplex_scans.py' script has completed successfully.")
        return

    job_id_short = latest_job.name.split('/')[-1]
    print(f"[SUCCESS] Found the latest successful job: '{job_id_short}'.")

    # 2. Fetch the full, detailed profile result for the job.
    print(f"[INFO] Retrieving detailed profile results for job '{job_id_short}'...")
    try:
        request = dataplex_v1.GetDataScanJobRequest(
            name=latest_job.name,
            view=dataplex_v1.GetDataScanJobRequest.DataScanJobView.FULL,
        )
        job_with_full_results = client.get_data_scan_job(request=request)
    except Exception as e:
        print(f"[ERROR] Failed to retrieve detailed job results: {e}")
        return

    # 3. Convert the profile result to a dictionary and save it to a JSON file.
    if job_with_full_results.data_profile_result:
        profile_dict = MessageToDict(job_with_full_results.data_profile_result._pb)
        save_to_json_file(profile_dict, OUTPUT_FILENAME)
    else:
        print("[WARN] The job completed, but no data profile result was found within it.")

    print("\n[INFO] Script finished successfully.")


if __name__ == "__main__":
    main()

এখন, আপনার টার্মিনাল থেকে স্ক্রিপ্ট চালান:

python 2_dq_profile_save.py

সফলভাবে সমাপ্তির পরে, আপনার ডিরেক্টরিতে dq_profile_results.json নামে একটি নতুন ফাইল থাকবে। এই ফাইলটিতে সমৃদ্ধ, বিশদ পরিসংখ্যানগত মেটাডেটা রয়েছে যা আমরা ডেটা গুণমানের নিয়ম তৈরি করতে ব্যবহার করব। আপনি যদি dq_profile_results.json এর বিষয়বস্তু পরীক্ষা করতে চান তবে নিম্নলিখিত কমান্ডটি চালান:

cat dq_profile_results.json

4. জেমিনি CLI এর সাথে ডেটা গুণমানের নিয়ম তৈরি করা

Gemini CLI ইনস্টল এবং কনফিগার করুন

আপনি যখন Gemini API-কে প্রোগ্রাম্যাটিকভাবে কল করতে পারেন, তখন Gemini CLI-এর মতো একটি টুল ব্যবহার করে আপনার টার্মিনাল ওয়ার্কফ্লোতে সরাসরি জেনারেটিভ AI সংহত করার একটি শক্তিশালী, ইন্টারেক্টিভ উপায় অফার করে। মিথুন CLI শুধুমাত্র একটি চ্যাটবট নয়; এটি একটি কমান্ড-লাইন ওয়ার্কফ্লো টুল যা আপনার স্থানীয় ফাইলগুলি পড়তে পারে, আপনার কোড বুঝতে পারে এবং জটিল কাজগুলি স্বয়ংক্রিয় করতে gcloud-এর মতো অন্যান্য সিস্টেম টুলের সাথে ইন্টারঅ্যাক্ট করতে পারে। এটি আমাদের ব্যবহারের ক্ষেত্রে এটিকে আদর্শ করে তোলে।

পূর্বশর্ত

প্রথমে, নিশ্চিত করুন যে আপনার প্রয়োজনীয় পূর্বশর্ত রয়েছে: Node.js সংস্করণ 20 বা উচ্চতর আপনার ক্লাউড শেল পরিবেশে ইনস্টল করা আবশ্যক। আপনি node -v চালিয়ে আপনার সংস্করণ পরীক্ষা করতে পারেন।

ইনস্টলেশন

Gemini CLI ব্যবহার করার দুটি উপায় রয়েছে: অস্থায়ীভাবে ইনস্টল করা বা আরও স্থায়ীভাবে ইনস্টল করা। আমরা এখানে উভয় পদ্ধতি কভার করব।

আপনি কোনো স্থায়ী ইনস্টলেশন ছাড়াই একটি একক সেশনের জন্য সরাসরি জেমিনি CLI চালাতে পারেন। এটি "এটি চেষ্টা করে দেখুন" করার সবচেয়ে পরিষ্কার এবং দ্রুততম উপায় কারণ এটি আপনার পরিবেশকে সম্পূর্ণরূপে অপরিবর্তিত রাখে৷

আপনার ক্লাউড শেল টার্মিনালে, চালান:

npx https://github.com/google-gemini/gemini-cli

এই কমান্ডটি অস্থায়ীভাবে ডাউনলোড করে এবং CLI প্যাকেজ চালায়।

যেকোনো বাস্তব প্রকল্পের জন্য, প্রস্তাবিত সেরা অনুশীলন হল আপনার প্রকল্প ডিরেক্টরিতে স্থানীয়ভাবে CLI ইনস্টল করা। এই পদ্ধতির বেশ কয়েকটি মূল সুবিধা রয়েছে:

  • নির্ভরতা বিচ্ছিন্নতা: এটি নিশ্চিত করে যে আপনার প্রকল্পের CLI-এর নিজস্ব সংস্করণ রয়েছে, অন্যান্য প্রকল্পের সাথে সংস্করণের দ্বন্দ্ব প্রতিরোধ করে।
  • পুনরুত্পাদনযোগ্যতা: যে কেউ আপনার প্রকল্পের ক্লোন করে তারা ঠিক একই নির্ভরতা ইনস্টল করতে পারে, আপনার সেটআপটিকে নির্ভরযোগ্য এবং বহনযোগ্য করে তোলে।
  • সর্বোত্তম অনুশীলন সারিবদ্ধকরণ: এটি বিশ্বব্যাপী (-জি) ইনস্টলেশনের সমস্যাগুলি এড়িয়ে Node.js প্রকল্প নির্ভরতা পরিচালনার জন্য আদর্শ মডেল অনুসরণ করে।

স্থানীয়ভাবে CLI ইনস্টল করতে, আপনার প্রকল্প ফোল্ডার ( programmatic-dq ) থেকে নিম্নলিখিত কমান্ডটি চালান:

npm install @google/gemini-cli

এটি programmatic-dq-এর ভিতরে একটি node_modules ফোল্ডার তৈরি করে। আপনি যে সংস্করণটি ইনস্টল করেছেন তা চালানোর জন্য, npx কমান্ডটি ব্যবহার করুন।

npx gemini

প্রথমবার সেটআপ

আপনি যে পদ্ধতিটি বেছে নিন, প্রথমবার যখন আপনি CLI চালু করবেন, এটি একটি এককালীন সেটআপ প্রক্রিয়ার মাধ্যমে গাইড করবে।

8a25fab5951c6c39.png

আপনাকে একটি রঙের থিম বাছাই করতে এবং তারপর প্রমাণীকরণ করতে বলা হবে। সহজ পদ্ধতি হল যখন অনুরোধ করা হয় তখন আপনার Google অ্যাকাউন্ট দিয়ে সাইন ইন করা। প্রদত্ত বিনামূল্যের স্তর এই কোডল্যাবের জন্য যথেষ্ট।

এখন যেহেতু CLI ইনস্টল করা হয়েছে এবং কনফিগার করা হয়েছে, আপনি নিয়ম তৈরি করে এগিয়ে যেতে প্রস্তুত। CLI তার বর্তমান ডিরেক্টরির ফাইল সম্পর্কে সচেতন, যা পরবর্তী ধাপের জন্য গুরুত্বপূর্ণ।

ডেটা মানের নিয়ম তৈরি করুন

যদিও LLM-কে এক শটে একটি কনফিগারেশন ফাইল তৈরি করতে বলা সম্ভব, তবে জেনারেটিভ মডেলগুলির অ-নির্ধারক প্রকৃতির অর্থ হল আউটপুট সর্বদা gcloud-এর মতো সরঞ্জামগুলির জন্য প্রয়োজনীয় কঠোর স্কিমার সাথে পুরোপুরি সঙ্গতিপূর্ণ নাও হতে পারে। একটি আরও নির্ভরযোগ্য পদ্ধতি হল একটি ইন্টারেক্টিভ, বহু-পদক্ষেপ প্রক্রিয়া যেখানে আপনার কাছে প্রথমে একটি পরিকল্পনা প্রস্তাব করার জন্য বিশ্লেষক হিসাবে AI কাজ করে, আপনি (মানব বিশেষজ্ঞ) সেই পরিকল্পনাটি পর্যালোচনা করে অনুমোদন করেন এবং শুধুমাত্র তখনই AI আপনার অনুমোদিত নির্দেশের ভিত্তিতে চূড়ান্ত কোড তৈরি করে।

এই পদ্ধতিটি একটি সাধারণ কমান্ড থেকে প্রক্রিয়াটিকে একটি সহযোগী অধিবেশনে রূপান্তরিত করে, চূড়ান্ত আউটপুটটি সঠিক, বৈধ এবং স্থাপনার জন্য প্রস্তুত তা নিশ্চিত করে।

প্রথমে, আমরা জেমিনিকে পরিসংখ্যানগত প্রোফাইল বিশ্লেষণ করতে বলব এবং একজন বিশেষজ্ঞ ডেটা ইঞ্জিনিয়ার হিসাবে কাজ করার জন্য একটি কর্ম পরিকল্পনা প্রস্তাব করব। আমরা স্পষ্টভাবে এটিকে এখনও YAML ফাইল না লিখতে বলছি। এটি বিশ্লেষণ এবং ন্যায্যতার উপর তার মনোযোগ নিবদ্ধ করে।

আপনার ইন্টারেক্টিভ জেমিনি CLI সেশনে, নিম্নলিখিত প্রম্পট পেস্ট করুন:

cd9792a6f1eb9f3.png

You are an expert Google Cloud Dataplex engineer. 
Your first task is to create a plan. I have a file in the current directory named ./dq_profile_results.json. 
Based on the statistical data within that file, propose a step-by-step plan to create a Dataplex data quality rules file. 
Your plan should identify which specific columns are good candidates for rules like nonNullExpectation, setExpectation, or rangeExpectation, and explain why based on the metrics (e.g., "Plan to create a nonNullExpectation for column X because its null percentage is 0%"). 
Do not write the YAML file yet. Just provide the plan.

জেমিনি JSON ফাইল বিশ্লেষণ করবে এবং এর মতো একটি কাঠামোগত পরিকল্পনা ফেরত দেবে:

Plan to create Dataplex data quality rules

1. Create a row count rule:
  - Analysis: The profile shows a total of 26,489 rows.
  - Proposed Rule: I will implement a rowCount rule to ensure the table's row count remains within a healthy range (e.g., 20,000 to 30,000). This is a fundamental check to guard against major data loading failures or unexpected deletions.
2. Implement non-null expectation rules:
  - Analysis: The profiling results show that many columns have no null values. For example, event_date, event_timestamp, event_name, user_pseudo_id, stream_id, and platform all appear to be fully populated.
  - Proposed Rules: I will create nonNullExpectation rules for columns where the nullRatio is 0 or not present, indicating they are always expected to contain a value:
    - event_date
    - event_timestamp
    - event_name
    - user_pseudo_id
    - stream_id
    - platform
    - device_category
    - device_os
3. Implement set expectation rules:
  - Analysis: Several columns contain a small, finite set of values, making them ideal for set validation.
  - Proposed Rules: I will create setExpectation rules for these columns:
    - platform: It only contains the value "WEB".
    - device_category: It contains only "desktop", "mobile", and "tablet".
    - geo_continent: It has a well-defined list of continents.
traffic_source_medium: It has a small list of valid mediums like "organic", "(none)", and "referral".
4. Implement range expectation rules:
  - Analysis: The profile provides minimum and maximum values for numeric and string length fields.
  - Proposed Rules: I will create rangeExpectation rules for the following:
    - event_timestamp: The profile shows a clear min and max. I will use these values to create a range check.
    - event_date (String Length): The profile indicates that the minLength and maxLength are both 8, which is perfect for enforcing a YYYYMMDD format.

এটি সমগ্র কর্মপ্রবাহের সবচেয়ে গুরুত্বপূর্ণ পদক্ষেপ: হিউম্যান-ইন-দ্য-লুপ (HITL) পর্যালোচনা। মিথুন দ্বারা উত্পন্ন পরিকল্পনাটি সম্পূর্ণরূপে ডেটাতে পরিসংখ্যানগত নিদর্শনগুলির উপর ভিত্তি করে। এটি আপনার ব্যবসার প্রেক্ষাপট, ভবিষ্যতের ডেটা পরিবর্তন বা আপনার ডেটার পিছনে নির্দিষ্ট অভিপ্রায় সম্পর্কে কোনও বোঝাপড়া নেই৷ মানব বিশেষজ্ঞ হিসাবে আপনার ভূমিকা হল এই পরিকল্পনাটিকে কোডে পরিণত করার আগে যাচাই করা, সংশোধন করা এবং অনুমোদন করা।

মিথুন যে পরিকল্পনা দিয়েছেন তা সাবধানতার সাথে পর্যালোচনা করুন।

  • এটা কি অর্থে?
  • এটা কি আপনার ব্যবসার জ্ঞানের সাথে সামঞ্জস্যপূর্ণ?
  • কোন পরিসংখ্যানগতভাবে সঠিক কিন্তু কার্যত অকেজো নিয়ম আছে?

আপনি মিথুন থেকে প্রাপ্ত আউটপুট পরিবর্তিত হতে পারে। আপনার লক্ষ্য এটি পরিমার্জিত হয়.

উদাহরণস্বরূপ, কল্পনা করুন যে পরিকল্পনাটি একটি rowCount নিয়মের পরামর্শ দেয় কারণ টেবিলটিতে নমুনা ডেটাতে একটি নির্দিষ্ট সংখ্যক সারি রয়েছে। একজন মানব বিশেষজ্ঞ হিসাবে, আপনি হয়তো জানেন যে এই টেবিলের আকার প্রতিদিন বৃদ্ধি পাবে বলে আশা করা হচ্ছে, একটি কঠোর সারি গণনা নিয়মকে অব্যবহারিক করে তোলে এবং সম্ভবত মিথ্যা সতর্কতা সৃষ্টি করতে পারে। এটি ব্যবসায়িক প্রসঙ্গ প্রয়োগ করার একটি নিখুঁত উদাহরণ যা AI এর অভাব রয়েছে।

এখন, আপনি মিথুনকে প্রতিক্রিয়া জানাবেন এবং কোডটি তৈরি করার জন্য চূড়ান্ত কমান্ড দেবেন। আপনি যে পরিকল্পনাটি বাস্তবে পেয়েছেন এবং আপনি যে সংশোধন করতে চান তার উপর ভিত্তি করে আপনাকে অবশ্যই নিম্নলিখিত প্রম্পটটি মানিয়ে নিতে হবে।

নিচের প্রম্পটটি একটি টেমপ্লেট । প্রথম লাইন হল যেখানে আপনি আপনার নির্দিষ্ট সংশোধন প্রদান করবেন। মিথুন আপনাকে দেওয়া পরিকল্পনাটি যদি নিখুঁত হয় এবং কোনও পরিবর্তনের প্রয়োজন হয় না, আপনি কেবল সেই লাইনটি মুছে ফেলতে পারেন।

একই মিথুন সেশনে, নিম্নলিখিত প্রম্পটের আপনার অভিযোজিত সংস্করণ পেস্ট করুন:

[YOUR CORRECTIONS AND APPROVAL GO HERE. Examples:
- "The plan looks good. Please proceed."
- "The rowCount rule is not necessary, as the table size changes daily. The rest of the plan is approved. Please proceed."
- "For the setExpectation on the geo_continent column, please also include 'Antarctica'."]

Once you have incorporated my feedback, please generate the `dq_rules.yaml` file.

You must adhere to the following strict requirements:

- Schema Compliance: The YAML structure must strictly conform to the DataQualityRule specification. For a definitive source of truth, you must refer to the sample_rule.yaml file in the current directory and the DataQualityRule class definition in the local virtual environment path: ./dq_venv/.../google/cloud/dataplex_v1/types/data_quality.py.

- Data-Driven Values: All rule parameters, such as thresholds or expected values, must be derived directly from the statistical metrics in dq_profile_results.json.

- Rule Justification: For each rule, add a comment (#) on the line above explaining the justification, as you outlined in your plan.

- Output Purity: The final output must only be the raw YAML code block, perfectly formatted and ready for immediate deployment.

জেমিনি এখন আপনার সুনির্দিষ্ট, মানব-প্রমাণিত নির্দেশাবলীর উপর ভিত্তি করে YAML সামগ্রী তৈরি করবে। সমাপ্তির পরে, আপনি আপনার কাজের ডিরেক্টরিতে dq_rules.yaml নামে একটি নতুন ফাইল পাবেন।

ডেটা মানের স্ক্যান তৈরি করুন এবং চালান

এখন আপনার কাছে একটি AI-উত্পন্ন, মানব-প্রমাণিত dq_rules.yaml ফাইল আছে, আপনি আত্মবিশ্বাসের সাথে এটি স্থাপন করতে পারেন।

টাইপ করে জেমিনি CLI থেকে প্রস্থান করুন /quit বা Ctrl+C দুবার টিপে।

নিম্নলিখিত gcloud কমান্ড একটি নতুন Dataplex ডেটা স্ক্যান সংস্থান তৈরি করে। এটি এখনও স্ক্যান চালায় না; এটি ডাটাপ্লেক্সের সাথে স্ক্যানের সংজ্ঞা এবং কনফিগারেশন (আমাদের YAML ফাইল) নিবন্ধন করে।

আপনার টার্মিনালে এই কমান্ডটি চালান:

export DQ_SCAN="dq-scan"
gcloud dataplex datascans create data-quality $DQ_SCAN \
    --project=$PROJECT_ID \
    --location=$REGION \
    --data-quality-spec-file=dq_rules.yaml \
    --data-source-resource="//bigquery.googleapis.com/projects/$PROJECT_ID/datasets/$DATASET_ID/tables/mv_ga4_user_session_flat"

স্ক্যান এখন সংজ্ঞায়িত করা হয়েছে, আপনি এটি কার্যকর করার জন্য একটি কাজ ট্রিগার করতে পারেন।

gcloud dataplex datascans run $DQ_SCAN --location=$REGION --project=$PROJECT_ID

এই কমান্ডটি একটি কাজের আইডি আউটপুট করবে। আপনি Google ক্লাউড কনসোলের Dataplex বিভাগে এই কাজের স্থিতি নিরীক্ষণ করতে পারেন। একবার সম্পূর্ণ হলে, ফলাফল বিশ্লেষণের জন্য একটি BigQuery টেবিলে লেখা হবে।

5. হিউম্যান-ইন-দ্য-লুপ (HITL) এর গুরুত্বপূর্ণ ভূমিকা

যদিও শাসন তৈরির গতি ত্বরান্বিত করার জন্য জেমিনি ব্যবহার করা অবিশ্বাস্যভাবে শক্তিশালী, AI-কে সম্পূর্ণ স্বায়ত্তশাসিত পাইলট নয়, অত্যন্ত দক্ষ সহ-পাইলট হিসাবে বিবেচনা করা অত্যন্ত গুরুত্বপূর্ণ। হিউম্যান-ইন-দ্য-লুপ (HITL) প্রক্রিয়া একটি ঐচ্ছিক পরামর্শ নয়; এটি একটি অ-আলোচনাযোগ্য, যেকোনো শক্তিশালী এবং বিশ্বস্ত ডেটা গভর্নেন্স ওয়ার্কফ্লোতে ভিত্তিমূলক পদক্ষেপ। কঠোর মানব তদারকি ছাড়াই কেবল এআই-উত্পন্ন শিল্পকর্ম স্থাপন করা ব্যর্থতার একটি রেসিপি।

AI-উত্পন্ন dq_rules.yaml কে একজন অত্যন্ত দ্রুত কিন্তু অনভিজ্ঞ এআই বিকাশকারীর দ্বারা জমা দেওয়া একটি পুল অনুরোধ হিসাবে ভাবুন৷ এটিকে আপনার শাসন নীতির "প্রধান শাখায়" একীভূত করা এবং মোতায়েন করার আগে এটির জন্য একজন প্রবীণ মানব বিশেষজ্ঞের কাছ থেকে একটি পুঙ্খানুপুঙ্খ পর্যালোচনার প্রয়োজন - আপনি - এই পর্যালোচনাটি বড় ভাষার মডেলগুলির অন্তর্নিহিত দুর্বলতাগুলি প্রশমিত করার জন্য অপরিহার্য।

এই মানবিক পর্যালোচনা কেন অপরিহার্য এবং আপনাকে বিশেষভাবে কী সন্ধান করতে হবে তার একটি বিশদ বিভাজন এখানে রয়েছে:

1. প্রাসঙ্গিক বৈধতা: AI-তে ব্যবসায়িক সচেতনতার অভাব রয়েছে

  • এলএলএম এর দুর্বলতা : একটি এলএলএম প্যাটার্ন এবং পরিসংখ্যানের একটি মাস্টার, কিন্তু এটি আপনার ব্যবসার প্রেক্ষাপট সম্পর্কে শূন্য বোঝার অধিকারী। উদাহরণস্বরূপ, যদি একটি কলাম, new_campaign_id একটি 98% নাল অনুপাত থাকে, তাহলে একটি LLM পরিসংখ্যানগত কারণে এই কলামটিকে উপেক্ষা করতে পারে।
  • মানুষের সমালোচনামূলক ভূমিকা: আপনি, মানব বিশেষজ্ঞ, জানেন যে new_campaign_id ক্ষেত্রটি গত সপ্তাহে একটি প্রধান পণ্য লঞ্চের জন্য যোগ করা হয়েছে। আপনি জানেন যে এটির শূন্য অনুপাত এখন বেশি হওয়া উচিত তবে উল্লেখযোগ্যভাবে হ্রাস পাওয়ার আশা করা হচ্ছে। আপনি এটাও জানেন যে একবার এটি জনবহুল হয়ে গেলে, এটি অবশ্যই একটি নির্দিষ্ট বিন্যাস অনুসরণ করবে৷ AI সম্ভবত এই বাহ্যিক ব্যবসায়িক জ্ঞান অনুমান করতে পারে না। আপনার ভূমিকা হল এআই-এর পরিসংখ্যানগত পরামর্শগুলিতে এই ব্যবসার প্রসঙ্গ প্রয়োগ করা, প্রয়োজনে সেগুলিকে ওভাররাইড করা বা বৃদ্ধি করা।

2. সঠিকতা এবং নির্ভুলতা: হ্যালুসিনেশন এবং সূক্ষ্ম ত্রুটি থেকে রক্ষা করা

  • এলএলএম-এর দুর্বলতা: এলএলএমগুলি "আত্মবিশ্বাসে ভুল" হতে পারে। তারা "হ্যালুসিনেট" করতে পারে বা কোড তৈরি করতে পারে যা সূক্ষ্মভাবে ভুল। উদাহরণস্বরূপ, এটি একটি সঠিক নামযুক্ত নিয়ম কিন্তু একটি অবৈধ প্যারামিটার সহ একটি YAML ফাইল তৈরি করতে পারে বা এটি একটি নিয়মের প্রকার ভুল বানান হতে পারে (যেমন, সঠিক setExpectation এর পরিবর্তে setExpectations )। এই সূক্ষ্ম ত্রুটিগুলি স্থাপনার ব্যর্থতার কারণ হবে, তবে সেগুলি চিহ্নিত করা কঠিন হতে পারে৷
  • মানুষের সমালোচনামূলক ভূমিকা: আপনার কাজ হল চূড়ান্ত লিন্টার এবং স্কিমা যাচাইকারী হিসাবে কাজ করা। আপনাকে অবশ্যই অফিসিয়াল Dataplex DataQualityRule স্পেসিফিকেশনের বিপরীতে জেনারেট করা YAML চেক করতে হবে। আপনি এটি "সঠিক দেখায়" কিনা তা পরীক্ষা করছেন না; লক্ষ্য API-এর সাথে এটি 100% সঙ্গতিপূর্ণ তা নিশ্চিত করতে আপনি এটির সিনট্যাকটিক এবং শব্দার্থিক সঠিকতা যাচাই করছেন। এই কারণেই কোডল্যাব জেমিনিকে স্কিমা ফাইলগুলি উল্লেখ করার জন্য অনুরোধ করে — ত্রুটির সম্ভাবনা কমাতে — তবে চূড়ান্ত যাচাইকরণ আপনার উপর নির্ভর করে৷

3. নিরাপত্তা এবং ঝুঁকি প্রশমন: নিম্নধারার পরিণতি প্রতিরোধ করা

  • এলএলএম-এর দুর্বলতা: একটি ত্রুটিপূর্ণ ডেটা গুণমানের নিয়ম উৎপাদনে নিয়োজিত হলে তা মারাত্মক পরিণতি ঘটাতে পারে। যদি AI একটি আর্থিক লেনদেনের পরিমাণের জন্য একটি rangeExpectation পরামর্শ দেয় যা খুব বিস্তৃত, তাহলে এটি প্রতারণামূলক কার্যকলাপ সনাক্ত করতে ব্যর্থ হতে পারে। বিপরীতভাবে, যদি এটি একটি ছোট ডেটা নমুনার উপর ভিত্তি করে খুব কঠোর নিয়মের পরামর্শ দেয়, তাহলে এটি আপনার অন-কল টিমকে হাজার হাজার মিথ্যা-ইতিবাচক সতর্কতার সাথে প্লাবিত করতে পারে, যার ফলে সতর্কতা অবসাদ ঘটতে পারে এবং বাস্তব সমস্যাগুলি মিস হতে পারে।
  • মানুষের গুরুত্বপূর্ণ ভূমিকা: আপনি নিরাপত্তা প্রকৌশলী. আপনাকে এআই প্রস্তাবিত প্রতিটি একক নিয়মের সম্ভাব্য নিম্নধারার প্রভাব মূল্যায়ন করতে হবে। নিজেকে জিজ্ঞাসা করুন: "এই নিয়মটি ব্যর্থ হলে কী হবে? সতর্কতা কি কার্যকর করা যায়? যদি এই নিয়মটি ভুলভাবে পাস হয় তবে ঝুঁকি কী?" এই ঝুঁকি মূল্যায়ন একটি অনন্যভাবে মানব ক্ষমতা যা চেকের সুবিধার বিপরীতে ব্যর্থতার মূল্যকে ওজন করে।

4. একটি অবিচ্ছিন্ন প্রক্রিয়া হিসাবে শাসন: দূরদর্শী জ্ঞান অন্তর্ভুক্ত করা

  • এলএলএম-এর দুর্বলতা: এআই-এর জ্ঞান ডেটার একটি স্ট্যাটিক স্ন্যাপশটের উপর ভিত্তি করে তৈরি হয়—প্রোফাইলটি নির্দিষ্ট সময়ে একটি নির্দিষ্ট বিন্দু থেকে তৈরি হয়। এর ভবিষ্যত ঘটনা সম্পর্কে কোন জ্ঞান নেই।
  • মানুষের সমালোচনামূলক ভূমিকা: আপনার শাসনের কৌশল অবশ্যই দূরদর্শী হতে হবে। আপনি জানেন যে একটি ডেটা উৎস পরের মাসে স্থানান্তরিত হবে, যা stream_id পরিবর্তন করবে। আপনি জানেন যে geo_country তালিকায় একটি নতুন দেশ যুক্ত হচ্ছে। HITL প্রক্রিয়াটি হল যেখানে আপনি এই ভবিষ্যত-রাষ্ট্র জ্ঞান ইনজেক্ট করেন, পরিকল্পিত ব্যবসা বা প্রযুক্তিগত বিবর্তনের সময় ভাঙ্গন রোধ করার জন্য নিয়ম আপডেট করা বা সাময়িকভাবে অক্ষম করা। ডেটা গুণমান এককালীন সেটআপ নয়; এটি একটি জীবন্ত প্রক্রিয়া যা অবশ্যই বিকশিত হবে এবং শুধুমাত্র একজন মানুষই সেই বিবর্তনের পথ দেখাতে পারে।

সংক্ষেপে, HITL হল অপরিহার্য মানের নিশ্চয়তা এবং নিরাপত্তা ব্যবস্থা যা এআই-চালিত শাসনকে একটি অভিনব কিন্তু ঝুঁকিপূর্ণ ধারণা থেকে একটি দায়িত্বশীল, মাপযোগ্য এবং এন্টারপ্রাইজ-গ্রেড অনুশীলনে রূপান্তরিত করে। এটি নিশ্চিত করে যে মোতায়েন করা চূড়ান্ত নীতিগুলি কেবল এআই-ত্বরিত নয় বরং মানব-প্রমাণিত, মেশিনের গতিকে মানব বিশেষজ্ঞদের প্রজ্ঞা এবং প্রেক্ষাপটের সাথে একত্রিত করে।

যাইহোক, মানুষের তত্ত্বাবধানের উপর এই জোর AI এর মান হ্রাস করে না। বিপরীতে, জেনারেটিভ এআই HITL প্রক্রিয়াকে ত্বরান্বিত করতে একটি গুরুত্বপূর্ণ ভূমিকা পালন করে।

AI ব্যতীত, একজন ডেটা ইঞ্জিনিয়ারকে এটি করতে হবে:

  1. ডেটা প্রোফাইল করতে ম্যানুয়ালি জটিল SQL কোয়েরি লিখুন (যেমন, প্রতিটি কলামের জন্য COUNT DISTINCT , AVG , MIN , MAX )।
  2. পরিশ্রমের সাথে স্প্রেডশীট দ্বারা ফলাফল স্প্রেডশীট বিশ্লেষণ করুন.
  3. স্ক্র্যাচ থেকে YAML নিয়ম ফাইলের প্রতিটি লাইন লিখুন, একটি ক্লান্তিকর এবং ত্রুটি-প্রবণ কাজ।

AI এই শ্রমসাধ্য, সময়সাপেক্ষ পদক্ষেপগুলিকে স্বয়ংক্রিয় করে। এটি একটি অক্লান্ত বিশ্লেষক হিসাবে কাজ করে যা অবিলম্বে পরিসংখ্যানগত প্রোফাইল প্রক্রিয়া করে এবং নীতির একটি সুগঠিত, 80% সম্পূর্ণ "প্রথম খসড়া" প্রদান করে।

এটি মানুষের কাজের প্রকৃতিকে মৌলিকভাবে পরিবর্তন করে। ম্যানুয়াল ডেটা ক্রাঞ্চিং এবং বয়লারপ্লেট কোডিংয়ে ঘন্টা ব্যয় করার পরিবর্তে, মানব বিশেষজ্ঞ অবিলম্বে সর্বোচ্চ-মূল্যের কাজগুলিতে ফোকাস করতে পারেন:

  • সমালোচনামূলক ব্যবসার প্রসঙ্গ প্রয়োগ করা।
  • AI এর যুক্তির সঠিকতা যাচাই করা।
  • কোন নিয়মগুলি সত্যিই গুরুত্বপূর্ণ সে সম্পর্কে কৌশলগত সিদ্ধান্ত নেওয়া।

এই অংশীদারিত্বে, AI "কি" (পরিসংখ্যানগত নিদর্শনগুলি কী?) পরিচালনা করে, মানুষকে "কেন" (কেন এই প্যাটার্নটি আমাদের ব্যবসার জন্য গুরুত্বপূর্ণ?) এবং "তাই কী" (তাহলে আমাদের নীতি কী হওয়া উচিত?) এর উপর ফোকাস করার জন্য মুক্ত করে। অতএব, AI লুপ প্রতিস্থাপন করে না; এটি লুপের মাধ্যমে প্রতিটি চক্রকে দ্রুত, স্মার্ট এবং আরও প্রভাবশালী করে তোলে।

6. আপনার পরিবেশ পরিষ্কার করা

এই কোডল্যাবে ব্যবহৃত সংস্থানগুলির জন্য আপনার Google ক্লাউড অ্যাকাউন্টে ভবিষ্যতের চার্জগুলি এড়াতে, আপনার সংস্থানগুলি রয়েছে এমন প্রকল্পটি মুছে ফেলা উচিত৷ যাইহোক, আপনি যদি প্রকল্পটি রাখতে চান তবে আপনি আপনার তৈরি করা পৃথক সংস্থানগুলি মুছতে পারেন।

ডেটাপ্লেক্স স্ক্যানগুলি মুছুন

প্রথমে, আপনার তৈরি করা প্রোফাইল এবং মানের স্ক্যান মুছে দিন। গুরুত্বপূর্ণ সংস্থানগুলির দুর্ঘটনাজনিত মুছে ফেলা রোধ করতে, এই কমান্ডগুলি এই কোডল্যাবে তৈরি স্ক্যানগুলির নির্দিষ্ট নাম ব্যবহার করে।

# Delete the Data Quality Scan
gcloud dataplex datascans delete dq-scan \
    --location=us-central1 \
    --project=$PROJECT_ID --quiet

# Delete the Data Profile Scans
gcloud dataplex data-scans delete profile-scan-mv-ga4-user-session-flat \
    --location=us-central1 \
    --project=$PROJECT_ID --quiet

gcloud dataplex data-scans delete profile-scan-mv-ga4-ecommerce-transactions \
    --location=us-central1 \
    --project=$PROJECT_ID --quiet

gcloud dataplex data-scans delete profile-scan-mv-ga4-ecommerce-items \
    --location=us-central1 \
    --project=$PROJECT_ID --quiet

BigQuery ডেটাসেট মুছুন

এরপর, BigQuery ডেটাসেট মুছুন। এই কমান্ডটি অপরিবর্তনীয় এবং নিশ্চিতকরণ ছাড়াই ডেটাসেট এবং এর সমস্ত টেবিল অপসারণ করতে -f (ফোর্স) পতাকা ব্যবহার করে।

# Manually type this command to confirm you are deleting the correct dataset
bq rm -r -f --dataset $PROJECT_ID:dataplex_dq_codelab

7. অভিনন্দন!

আপনি সফলভাবে কোডল্যাব সম্পন্ন করেছেন!

আপনি একটি এন্ড-টু-এন্ড, প্রোগ্রাম্যাটিক ডেটা গভর্নেন্স ওয়ার্কফ্লো তৈরি করেছেন। আপনি জটিল BigQuery ডেটা সমতল করার জন্য ম্যাটেরিয়ালাইজড ভিউ ব্যবহার করে এটিকে বিশ্লেষণের উপযোগী করে শুরু করেছেন। তারপরে আপনি পরিসংখ্যানগত মেটাডেটা তৈরি করতে প্রোগ্রাম্যাটিকভাবে ডেটাপ্লেক্স প্রোফাইল স্ক্যান চালিয়েছেন। সবচেয়ে গুরুত্বপূর্ণভাবে, আপনি প্রোফাইল আউটপুট বিশ্লেষণ করতে এবং বুদ্ধিমত্তার সাথে একটি "পলিসি-এ-কোড" আর্টিফ্যাক্ট ( dq_rules.yaml ) তৈরি করতে জেমিনি CLI ব্যবহার করেছেন। তারপরে আপনি এই কনফিগারেশনটিকে একটি স্বয়ংক্রিয় ডেটা কোয়ালিটি স্ক্যান হিসাবে স্থাপন করতে CLI ব্যবহার করেছেন, একটি আধুনিক, স্কেলযোগ্য গভর্নেন্স কৌশলের লুপ বন্ধ করে।

আপনি এখন Google ক্লাউডে নির্ভরযোগ্য, এআই-ত্বরিত, এবং মানব-প্রমাণিত ডেটা গুণমান সিস্টেম তৈরির জন্য মৌলিক প্যাটার্ন দিয়ে সজ্জিত।

পরবর্তী কি?

  • CI/CD এর সাথে ইন্টিগ্রেট করুন: dq_rules.yaml ফাইলটি নিন এবং এটি একটি গিট রিপোজিটরিতে কমিট করুন। একটি CI/CD পাইপলাইন তৈরি করুন (যেমন, ক্লাউড বিল্ড বা গিটহাব অ্যাকশন ব্যবহার করে) যা নিয়ম ফাইল আপডেট হলেই স্বয়ংক্রিয়ভাবে ডেটাপ্লেক্স স্ক্যান স্থাপন করে।
  • কাস্টম এসকিউএল নিয়মগুলি অন্বেষণ করুন: আদর্শ নিয়মের প্রকারের বাইরে যান। ডেটাপ্লেক্স কাস্টম এসকিউএল নিয়মগুলিকে আরও জটিল, ব্যবসা-নির্দিষ্ট যুক্তি প্রয়োগ করতে সমর্থন করে যা পূর্বনির্ধারিত চেকের সাথে প্রকাশ করা যায় না। এটি আপনার অনন্য প্রয়োজনীয়তা অনুযায়ী যাচাইকরণের জন্য একটি শক্তিশালী বৈশিষ্ট্য।
  • দক্ষতা এবং খরচের জন্য স্ক্যানগুলি অপ্টিমাইজ করুন: খুব বড় টেবিলের জন্য, আপনি সর্বদা সমগ্র ডেটাসেট স্ক্যান না করে কর্মক্ষমতা উন্নত করতে এবং খরচ কমাতে পারেন। নির্দিষ্ট সময় ফ্রেম বা ডেটা বিভাগে স্ক্যানকে সংকীর্ণ করতে ফিল্টার ব্যবহার করে অন্বেষণ করুন, বা আপনার ডেটার একটি প্রতিনিধি শতাংশ পরীক্ষা করতে নমুনাযুক্ত স্ক্যানগুলি কনফিগার করুন।
  • ফলাফলগুলি কল্পনা করুন: প্রতিটি Dataplex ডেটা গুণমান স্ক্যানের আউটপুট একটি BigQuery টেবিলে লেখা হয়। আপনার সংজ্ঞায়িত মাত্রা (যেমন, সম্পূর্ণতা, বৈধতা) দ্বারা একত্রিত, সময়ের সাথে সাথে আপনার ডেটা মানের স্কোর ট্র্যাক করে এমন ড্যাশবোর্ড তৈরি করতে এই টেবিলটিকে লুকার স্টুডিওতে সংযুক্ত করুন। এটি পর্যবেক্ষণকে সক্রিয় এবং সমস্ত স্টেকহোল্ডারদের কাছে দৃশ্যমান করে তোলে।
  • সর্বোত্তম অনুশীলনগুলি ভাগ করুন: সম্মিলিত অভিজ্ঞতা লাভ করতে এবং আপনার ডেটা গুণমানের কৌশল উন্নত করতে আপনার সংস্থার মধ্যে জ্ঞান ভাগ করে নেওয়াকে উত্সাহিত করুন৷ ডেটা আস্থার সংস্কৃতি গড়ে তোলা আপনার শাসনের সর্বাধিক প্রচেষ্টা করার মূল চাবিকাঠি।
  • ডকুমেন্টেশন পড়ুন: