BigQuery এর পাইপ সিনট্যাক্স: SQL কে সহজ, দ্রুত এবং আরও পাঠযোগ্য করে তোলা

যার সাথে কাজ করেছেন এসকিউএল এর সাথে যে ভালোবাসা-ঘৃণার সম্পর্ক তৈরি হয় তা সে জানে। SQL শক্তিশালী, মানসম্মত এবং প্রকাশযোগ্য—কিন্তু এটি স্কেলে পড়া এবং বজায় রাখার জন্য সবচেয়ে অপ্রচলিত ভাষাগুলির মধ্যে একটি। আপনার প্রশ্ন যত গভীরতর হবে, আসলে কী ঘটছে এবং কোন ক্রমে তা বোঝা তত কঠিন হয়ে পড়বে।
কারণ SQL আপনার ভাবনা অনুযায়ী চলে না। আপনি লেখা দিয়ে শুরু করুন। SELECT, কিন্তু ডাটাবেস আসলে প্রথমে এটি প্রক্রিয়া করে না। ইঞ্জিনটি দিয়ে শুরু হয় FROM clause ব্যবহার করে, তারপর ডেটা যোগ করে, ফিল্টার করে, একত্রিত করে, এবং পরে শুধুমাত্র বাছাই এবং প্রক্ষেপণ প্রয়োগ করে। ফলাফল হল একটি কোয়েরি যা লেখা হয় অনগ্রসর এটি যেভাবে কার্যকর করা হয় তার তুলনায়।
সিনট্যাক্স এবং এক্সিকিউশনের মধ্যে এই অমিল SQL কে জ্ঞানীয়ভাবে ভারী এবং গণনাগতভাবে ব্যয়বহুল করে তোলে। বিশ্লেষকরা প্রায়শই সাবকোয়েরি বা সাধারণ টেবিল এক্সপ্রেশনের উপর নির্ভর করেন (CTEs) একটি উপর থেকে নীচের প্রবাহ অনুকরণ করতে, অপ্রয়োজনীয় জটিলতা এবং অপ্রয়োজনীয়তা যোগ করে। এমনকি অভিজ্ঞ ব্যবহারকারীরাও তাদের সমাধান করা সমস্যার উপর মনোযোগ দেওয়ার পরিবর্তে যুক্তির নেস্টেড ব্লকগুলি ডিবাগ করে ফেলেন।
এটি মোকাবেলা করার জন্য, BigQuery- তে support1s যে ক্রমে পড়া হয়, সেই ক্রমেই সঞ্চালিত হয়। ভেতরে যুক্তি লেখার পরিবর্তে, আপনি ধাপে ধাপে এটি লিখবেন, যেমন একটি ডেটা পাইপলাইন—প্রতিটি লাইন একটি স্বতন্ত্র রূপান্তরের প্রতিনিধিত্ব করে। ফলাফল হল SQL যা বোঝা সহজ, ডিবাগ করা সহজ এবং আধুনিক ডেটা বিশ্লেষণের জন্য অনেক বেশি স্বজ্ঞাত।

উপরের ছবিটি পাইপ সিনট্যাক্সের মূল সমস্যার সমাধান দেখায়। ঐতিহ্যবাহী SQL-এ, বাক্য গঠনের ক্রম (আপনি কীভাবে একটি প্রশ্ন লিখবেন) এর সাথে ভুলভাবে সারিবদ্ধ। শব্দার্থিক ক্রম (ডাটাবেস আসলে কীভাবে এটি প্রক্রিয়া করে)। উদাহরণস্বরূপ, SELECT উপরে দেখা যাচ্ছে, কিন্তু ইঞ্জিন যোগদান, ফিল্টারিং, গ্রুপিং এবং বাছাই সম্পন্ন না হওয়া পর্যন্ত এটি মূল্যায়ন করে না।
এই ক্রমটি একটি BigQuery পাইপ কোয়েরির লজিক্যাল এবং সিনট্যাকটিক প্রবাহকে প্রতিনিধিত্ব করে — উপরে থেকে নীচে, বাম থেকে ডানে — যা ডাটাবেস আসলে কীভাবে ডেটা প্রক্রিয়া করে তা প্রতিফলিত করে।
- থেকে: যেকোনো পাইপ কোয়েরির শুরুর বিন্দু। প্রাথমিক টেবিল বা সাবকোয়েরি নির্ধারণ করে যেখান থেকে ডেটা প্রবাহিত হয়। পাইপ সিনট্যাক্সে,
FROMএকটি বৈধ কোয়েরি হিসেবে একা দাঁড়াতে পারে এবং একটি ক্রমিক পাইপলাইনে প্রবেশের জন্য কাজ করে। - যোগদান: অন্য টেবিল বা সাবকোয়েরি থেকে অতিরিক্ত কলাম এবং সারি দিয়ে বর্তমান টেবিলটি প্রসারিত করে। ক্রমানুসারে একাধিকবার ব্যবহার করা যেতে পারে (
|> JOIN table USING (key)), নেস্টেড সাবকোয়েরি ছাড়াই বাম-গভীর জয়েন্ট ট্রিগুলিকে পঠনযোগ্য করে তোলে। - সেট করুন: বিদ্যমান কলামের মানগুলি আপডেট করে (
|> SET column = expression)। এর মতো কাজ করেSELECT * REPLACE(...)স্ট্যান্ডার্ড SQL-তে কিন্তু পাইপলাইন ধাপ হিসেবে ব্যবহার করলে এটি আরও পঠনযোগ্য এবং মডুলার। - প্রসারিত করা: বিদ্যমান ডেটাসেটে গণনা করা কলাম যোগ করে (
|> EXTEND expression AS new_column)। SELECT * এর অনুরূপ, স্ট্যান্ডার্ড SQL-এ new_column কিন্তু জয়েন এবং ফিল্টারের মতো অন্যান্য ক্রিয়াকলাপের মধ্যে ক্রমবর্ধমানভাবে প্রাপ্ত ক্ষেত্র তৈরির অনুমতি দেয়। - ড্রপ: বর্তমান ডেটাসেট থেকে এক বা একাধিক কলাম সরিয়ে দেয় (
|> DROP column_name)। এর সমতুল্যSELECT * EXCEPT(column)স্ট্যান্ডার্ড SQL-তে এবং প্রায়শই আউটপুট সহজ করতে বা মধ্যবর্তী ডেটা আকার কমাতে ব্যবহৃত হয়। - কোথায়: শর্ত পূরণকারী সারি ফিল্টার করে (
|> WHERE condition)। পাইপলাইনের যেকোনো জায়গায়, একত্রিতকরণের আগে বা পরে, HAVING বা QUALIFY এর মতো বিভিন্ন কীওয়ার্ডের প্রয়োজন দূর করে। - সমষ্টিগত: পূর্ণ-সারণী বা গোষ্ঠীবদ্ধ সমষ্টি সম্পাদন করে (
|> AGGREGATE SUM(column) AS total GROUP BY category)। SELECT এর মধ্যে GROUP BY এবং সমষ্টিগত ফাংশনগুলিকে প্রতিস্থাপন করে, সিনট্যাক্সকে সরল করে এবং ক্রিয়াকলাপের যৌক্তিক ক্রম অনুসারে সারিবদ্ধ করে। - অর্ডার করুন: সারিগুলিকে ঊর্ধ্বমুখী বা অবরোহী ক্রমে সাজায় (
|> ORDER BY column DESC)। একটি ক্রমানুসারে ফলাফল সারণী তৈরি করে যা অপারেটররা অনুসরণ করতে পারে যেমনLIMIT. - সীমা: ফলাফলে সারির সংখ্যা সীমাবদ্ধ করে (
|> LIMIT 10)। পরে কাজ করেORDER BYঅথবা অক্রমযুক্ত টেবিলে, ফিল্টার এবং সমষ্টির প্রাকৃতিক ক্রম সংরক্ষণ করে। - কল করুন: বর্তমান টেবিলটিকে ইনপুট হিসেবে ব্যবহার করে একটি টেবিল-মূল্যায়িত ফাংশন বা মেশিন লার্নিং মডেল কার্যকর করে (
|> CALL ML.PREDICT(MODEL project.model_name))। নেস্টেড ফাংশন কলের প্রয়োজনীয়তা দূর করে, একটি রৈখিক এবং পঠনযোগ্য কর্মপ্রবাহ তৈরি করে। - নির্বাচন করুন: আউটপুটে অন্তর্ভুক্ত করার জন্য কলামের চূড়ান্ত প্রক্ষেপণ সংজ্ঞায়িত করে (
|> SELECT column1, column2)। পাইপলাইনে ক্লোজিং অপারেশন হিসেবে কাজ করে, ফাইনালের মতোইSELECTএকটি স্ট্যান্ডার্ড SQL কোয়েরিতে।
নিচে সবচেয়ে সাধারণ পরিস্থিতিগুলি দেওয়া হল যেখানে পাইপ সিনট্যাক্স SQL লজিককে সহজ করে তোলে, যা কোয়েরিগুলিকে আরও পরিষ্কার এবং দ্রুত কাজ করার সুযোগ করে দেয়।
সাবকোয়েরি ছাড়াই ডেটা একত্রিত করা
সমষ্টি হল এমন একটি জায়গা যেখানে SQL ভেতরে ভেতরে অনুভূত হতে শুরু করে। যদি আপনি কিছু গণনা করতে চান, তাহলে সেই গণনাগুলি গণনা করুন, আপনি হঠাৎ বন্ধনীর নরকে চলে যাবেন।
এসকিউএল
SELECT c_count, COUNT(*) AS custdist
FROM (
SELECT c_custkey, COUNT(o_orderkey) AS c_count
FROM customer
JOIN orders ON c_custkey = o_custkey
WHERE o_comment NOT LIKE '%unusual%packages%'
GROUP BY c_custkey
)
GROUP BY c_count
ORDER BY custdist DESC; পাইপ সিনট্যাক্স
FROM customer
|> JOIN orders ON c_custkey = o_custkey
AND o_comment NOT LIKE '%unusual%packages%'
|> AGGREGATE COUNT(o_orderkey) AS c_count GROUP BY c_custkey
|> AGGREGATE COUNT(*) AS custdist GROUP BY c_count
|> ORDER BY custdist DESC; আর কোন নেস্টিং বা ডাবল গ্রুপিং নেই। প্রতিটি ধাপ যৌক্তিকভাবে প্রবাহিত হয় এবং সম্পূর্ণ কোয়েরি পুনর্লিখন না করেই স্বাধীনভাবে পরিবর্তন করা যেতে পারে।
ধাপে ধাপে কলাম পরিষ্কার এবং রূপান্তর করা
যখন আপনাকে ছোট হাতের লেখা লিখতে হবে, মোট সংখ্যা গণনা করতে হবে এবং অতিরিক্ত কলাম বাদ দিতে হবে, তখন স্ট্যান্ডার্ড SQL আপনাকে একাধিক লেখা লিখতে বাধ্য করবে SELECT স্টেটমেন্ট। পাইপ সিনট্যাক্স প্রবর্তন করে SET, EXTEND, এবং DROP অপারেটর যাতে আপনি ক্রমানুসারে পরিবর্তনগুলি প্রয়োগ করতে পারেন।
এসকিউএল
SELECT o_custkey, ROUND(o_totalprice) AS total_price
FROM (
SELECT
o_custkey,
o_totalprice,
LOWER(o_orderstatus) AS o_orderstatus
FROM orders
)
WHERE total_price > 1000; পাইপ সিনট্যাক্স
FROM orders
|> SET o_orderstatus = LOWER(o_orderstatus)
|> EXTEND ROUND(o_totalprice) AS total_price
|> WHERE total_price > 1000
|> SELECT o_custkey, total_price; প্রতিটি অপারেশন পূর্ববর্তীটির উপর ভিত্তি করে তৈরি হয়, যার ফলে রূপান্তরগুলি ট্রেস করা এবং যুক্তি পুনঃব্যবহার করা সহজ হয়।
"থাকছে" মনে না রেখেই একত্রিতকরণের পরে ফিল্টারিং
SQL এর একটি বিশেষত্ব হলো ফিল্টারের সময়কাল ধারার উপর নির্ভর করে পরিবর্তিত হয়। আপনি ব্যবহার করেন WHERE গ্রুপিং করার আগে এবং HAVING পরে, কিন্তু বাস্তবে, উভয়ই কেবল সারি ফিল্টার করে। পাইপ সিনট্যাক্স আপনাকে ব্যবহার করতে দেয় WHERE ধারাবাহিকভাবে, আপনি যেখানেই রাখুন না কেন।
এসকিউএল
SELECT department, COUNT(*) AS emp_count
FROM employees
WHERE active = TRUE
GROUP BY department
HAVING COUNT(*) > 5; পাইপ সিনট্যাক্স
FROM employees
|> WHERE active = TRUE
|> AGGREGATE COUNT(*) AS emp_count GROUP BY department
|> WHERE emp_count > 5; এখন আপনি ফিল্টারগুলি আপনার চিন্তাভাবনা অনুযায়ী একই ক্রমে লিখতে পারেন: প্রথমে ডেটা ফিল্টার করুন, তারপর গ্রুপ করুন, তারপর ফলাফলের উপর আবার ফিল্টার করুন।
অস্থায়ী টেবিল ছাড়াই কোয়েরি ডিবাগ করা হচ্ছে
স্ট্যান্ডার্ড SQL-এ, একটি মধ্যবর্তী ফলাফল পরীক্ষা করার জন্য হয় একটি অস্থায়ী টেবিল তৈরি করতে হয় অথবা একাধিক CTE-তে কোডটি মোড়ানো প্রয়োজন। পাইপ সিনট্যাক্সের সাহায্যে, আপনি পাইপলাইনের যেকোনো বিন্দু পর্যন্ত কোয়েরি চালাতে পারেন।
এসকিউএল
WITH filtered AS (
SELECT * FROM orders WHERE o_totalprice > 500
),
summed AS (
SELECT o_custkey, SUM(o_totalprice) AS total
FROM filtered GROUP BY o_custkey
)
SELECT * FROM summed WHERE total > 10000; পাইপ সিনট্যাক্স
FROM orders
|> WHERE o_totalprice > 500
|> AGGREGATE SUM(o_totalprice) AS total GROUP BY o_custkey
|> WHERE total > 10000; কোয়েরির প্রতিটি প্রিফিক্স নিজেই এক্সিকিউটেবল, যার অর্থ আপনি যেকোনো পর্যায়ে ডেটা "উঁকি" দিতে পারেন। এটি ডিবাগ এবং পুনরাবৃত্তি করার জন্য একটি পরিষ্কার, আরও ইন্টারেক্টিভ উপায়।
নেস্টিং ছাড়াই মডেল এবং ফাংশনগুলিকে চেইন করা
টেবিল-ভ্যালুড ফাংশন বা BigQuery ML মডেলের সাথে কাজ করার সময়, নেস্টিং দ্রুত অপাঠ্য হয়ে যেতে পারে। পাইপ সিনট্যাক্স CALL ব্যবহার করে লিনিয়ার চেইনিং দিয়ে নেস্টেড কলগুলিকে প্রতিস্থাপন করে।
এসকিউএল
SELECT *
FROM ML.PREDICT(
MODEL `project.sentiment_model`,
(SELECT text FROM reviews)
); পাইপ সিনট্যাক্স
SELECT text FROM reviews
|> CALL ML.PREDICT(MODEL `project.sentiment_model`); যদি আপনি একাধিক মডেল বা রূপান্তর প্রয়োগ করেন, তাহলে আপনাকে কেবল অতিরিক্ত CALL লাইন স্ট্যাক করতে হবে—কোন বন্ধনীর প্রয়োজন নেই।
নেস্টেড সিলেক্ট ছাড়াই ডেটা পিভোটিং
ডেটা পিভট করা সবসময়ই একটি ক্লান্তিকর প্রক্রিয়া, প্রায়শই সাবকোয়েরির স্তর প্রয়োজন হয়। পাইপ সিনট্যাক্স এটিকে একটি প্রবাহিত ক্রমানুসারে সহজ করে তোলে।
এসকিউএল
SELECT *
FROM (
SELECT n_name, c_acctbal, c_mktsegment
FROM customer JOIN nation USING (n_nationkey)
)
PIVOT(SUM(c_acctbal) FOR n_name IN ('PERU', 'KENYA', 'JAPAN')); পাইপ সিনট্যাক্স
FROM customer
|> JOIN nation USING (n_nationkey)
|> SELECT n_name, c_acctbal, c_mktsegment
|> PIVOT(SUM(c_acctbal) FOR n_name IN ('PERU', 'KENYA', 'JAPAN')); কোয়েরিটি এখন গল্পের মতো পড়ছে: আপনার ডেটা দিয়ে শুরু করুন, এতে যোগদান করুন, আপনার যা প্রয়োজন তা নির্বাচন করুন, তারপর পিভট করুন।
পাইপ সিনট্যাক্স কেন একটি গেম-চেঞ্জার
পাইপ সিনট্যাক্স SQL-কে নতুন করে উদ্ভাবন করে না—এটি এটিকে স্পষ্ট করে। এটি SQL-এর ঘোষণামূলক কাঠামোর সবকিছু সংরক্ষণ করে কিন্তু লজিককে পিছনের দিকে লেখার জ্ঞানীয় ওভারহেডকে সরিয়ে দেয়।
ডেটা বিজ্ঞানী, বিশ্লেষক এবং প্রকৌশলীদের জন্য, এর অর্থ হল:
- কোয়েরি পড়া, লেখা এবং ডিবাগ করা সহজ
- সহজ কাজের জন্য আর কোন জাগলিং সাবকোয়েরি বা সিটিই নেই
- আপনি আসলে কীভাবে চিন্তা করেন তা প্রতিফলিত করে এমন সুগঠিত যুক্তি
- উন্নত কর্মক্ষমতা এবং কম অপ্রয়োজনীয় অপারেশন
BigQuery-এর পাইপ সিনট্যাক্স হল আধুনিক ডেটা যুগের জন্য SQL—রৈখিক, স্বজ্ঞাত এবং বাস্তব-বিশ্ব বিশ্লেষণের জন্য অপ্টিমাইজ করা।



