Spark SQL এর Window Functions একটি শক্তিশালী টুল যা ডেটার উপর অগ্রগতির ভিত্তিতে প্রক্রিয়াকরণ করতে সহায়তা করে। এটি একটি বিশেষ ধরনের ফাংশন যা একটি নির্দিষ্ট উইন্ডো (অথবা অংশ) এর মধ্যে কাজ করে এবং প্রতিটি রেকর্ডের জন্য একটি ফলাফল প্রদান করে। উইন্ডো ফাংশন মূলত সেই সমস্ত কেসে ব্যবহৃত হয় যেখানে আপনি আগের বা পরবর্তী রেকর্ডের উপর ভিত্তি করে বর্তমান রেকর্ডের সাথে কিছু কাজ করতে চান, যেমন রোলিং অ্যাগ্রিগেশন, রানিং টোটাল বা র্যাংকিং।
এটি ডেটা প্রসেসিং, বিশেষ করে অ্যানালাইটিক্যাল কাজের জন্য অত্যন্ত গুরুত্বপূর্ণ এবং সহায়ক হতে পারে। Spark SQL এ উইন্ডো ফাংশন ব্যবহারের মাধ্যমে আপনি জটিল অ্যানালাইসিস এবং হিসাব করতে পারেন, যেটি সাধারণ SQL অ্যাগ্রিগেট ফাংশনের সাহায্যে সম্ভব নয়।
Window Functions কী?
Window Functions হল এমন ফাংশন যা একটি নির্দিষ্ট "উইন্ডো" বা অংশের মধ্যে কাজ করে এবং আগের বা পরবর্তী রেকর্ডগুলোর উপর ভিত্তি করে ফলাফল প্রদান করে। সাধারণভাবে, এটি OVER() ক্লজের মাধ্যমে কাজ করে, যা উইন্ডোর সীমানা নির্ধারণ করে।
উইন্ডো ফাংশনের সাহায্যে আপনি নিম্নলিখিত কাজগুলো করতে পারেন:
- র্যাংকিং এবং রোকে (row) র্যাঙ্ক দেওয়া
- রানিং টোটাল বা অ্যাভারেজ হিসাব করা
- পারসেন্টাইল ক্যালকুলেশন
- পার্টিশন বা গ্রুপের মধ্যে অ্যাগ্রিগেশন
Spark SQL-এ Window Functions এর বৈশিষ্ট্য
১. PARTITION BY
PARTITION BY ক্লজটি উইন্ডোর ভিতরে একটি গ্রুপ তৈরি করতে ব্যবহৃত হয়। এটি ডেটাকে ভাগ করে দেয় এবং প্রতিটি পার্টিশনের জন্য উইন্ডো ফাংশন চালানো হয়।
২. ORDER BY
ORDER BY উইন্ডোর মধ্যে ডেটাকে একটি নির্দিষ্ট ক্রমে সাজানোর জন্য ব্যবহৃত হয়, যাতে ফাংশনগুলি ক্রমানুসারে সঠিকভাবে কাজ করতে পারে।
৩. ROWS BETWEEN
ROWS BETWEEN ক্লজটি উইন্ডোর মধ্যে কোন রেকর্ডগুলো অন্তর্ভুক্ত হবে তা নির্ধারণ করে। এটি ডেটাকে একটি রেঞ্জ হিসেবে ব্যাখ্যা করে (যেমন, আগের ২টি রেকর্ড বা পরবর্তী ১০টি রেকর্ড)।
Spark SQL-এ Window Functions ব্যবহার
Spark SQL এর Window Functions বিভিন্ন ধরনের কাজের জন্য ব্যবহৃত হতে পারে। নিচে কয়েকটি জনপ্রিয় উইন্ডো ফাংশনের ব্যবহার আলোচনা করা হল।
১. ROW_NUMBER() ফাংশন
ROW_NUMBER() একটি উইন্ডো ফাংশন যা প্রতিটি রেকর্ডের জন্য একটি ইউনিক র্যাংক প্রদান করে। এটি ডেটাকে একটি নির্দিষ্ট ক্রমে সাজানোর জন্য ব্যবহার করা হয়।
Python উদাহরণ:
from pyspark.sql import SparkSession
from pyspark.sql.window import Window
from pyspark.sql.functions import row_number
# SparkSession তৈরি
spark = SparkSession.builder.appName("WindowExample").getOrCreate()
# স্যাম্পল ডেটা তৈরি
data = [("Alice", 100), ("Bob", 200), ("Charlie", 300), ("David", 400)]
columns = ["Name", "Value"]
# DataFrame তৈরি
df = spark.createDataFrame(data, columns)
# উইন্ডো স্পেসিফিকেশন তৈরি (ORDER BY Value)
windowSpec = Window.orderBy("Value")
# ROW_NUMBER() ফাংশন ব্যবহার
df_with_row_number = df.withColumn("RowNumber", row_number().over(windowSpec))
df_with_row_number.show()
এখানে, row_number() ফাংশন ব্যবহার করে আমরা প্রতিটি রেকর্ডের জন্য একটি র্যাংক তৈরি করেছি, যেটি "Value" কলামের ক্রম অনুসারে সাজানো।
২. RANK() ফাংশন
RANK() ফাংশন একই রকম র্যাংকিং প্রদান করে, তবে যদি দুটি বা তার বেশি রেকর্ডের মান সমান হয়, তাহলে তাদের র্যাংক এক হবে, এবং পরবর্তী র্যাংকটি বাদ পড়বে।
Python উদাহরণ:
from pyspark.sql.functions import rank
# RANK() ফাংশন ব্যবহার
df_with_rank = df.withColumn("Rank", rank().over(windowSpec))
df_with_rank.show()
এখানে, rank() ফাংশন ব্যবহার করে আমরা র্যাংকিং তৈরি করেছি এবং সমান মানের জন্য একই র্যাংক দেয়া হয়েছে।
৩. SUM() / AVG() ফাংশন (Running Total)
SUM() এবং AVG() উইন্ডো ফাংশনগুলি রানিং টোটাল বা রানিং অ্যাভারেজ হিসাব করতে ব্যবহৃত হয়। এটি ডেটার একটি নির্দিষ্ট অংশের ওপর অগ্রগতির ভিত্তিতে হিসাব করে।
Python উদাহরণ:
from pyspark.sql.functions import sum
# উইন্ডো স্পেসিফিকেশন তৈরি (PARTITION BY Name)
windowSpec = Window.partitionBy("Name").orderBy("Value").rowsBetween(Window.unboundedPreceding, Window.currentRow)
# RUNNING SUM() ফাংশন ব্যবহার
df_with_running_sum = df.withColumn("RunningSum", sum("Value").over(windowSpec))
df_with_running_sum.show()
এখানে, sum() ফাংশন ব্যবহার করে আমরা "Value" কলামের জন্য রানিং টোটাল তৈরি করেছি, যেখানে ডেটা "Name" অনুযায়ী পার্টিশন করা হয়েছে।
৪. LEAD() এবং LAG() ফাংশন
LEAD() এবং LAG() ফাংশনগুলি আগের বা পরবর্তী রেকর্ডের মান ফেরত দেয়। এগুলি সাধারণত সময়ভিত্তিক বিশ্লেষণে ব্যবহৃত হয়।
Python উদাহরণ:
from pyspark.sql.functions import lead, lag
from pyspark.sql import functions as F
# LEAD() এবং LAG() ফাংশন ব্যবহার
df_with_lead_lag = df.withColumn("Lead", lead("Value", 1).over(windowSpec)) \
.withColumn("Lag", lag("Value", 1).over(windowSpec))
df_with_lead_lag.show()
এখানে, lead() এবং lag() ফাংশন ব্যবহার করে আমরা প্রতিটি রেকর্ডের পরবর্তী এবং আগের মান বের করেছি।
Spark SQL উইন্ডো ফাংশনের বাস্তব প্রয়োগ
Spark SQL উইন্ডো ফাংশনগুলি বেশ কিছু বাস্তব জীবনের অ্যানালিটিক্যাল কাজের জন্য ব্যবহার করা যেতে পারে, যেমন:
- ফাইনান্সিয়াল অ্যানালাইসিস: রানিং টোটাল, গ্রোথ রেট এবং প্রফিট মার্জিন হিসাব করা।
- র্যাংকিং: র্যাংকিং তৈরির জন্য যেমন, টপ সেলার, গ্রাহকের আয়ের ভিত্তিতে র্যাংক নির্ধারণ।
- সময়ভিত্তিক বিশ্লেষণ: স্টক মার্কেট অ্যানালাইসিস, যেখানে গতকালের, পরশুদিনের বা আগের সপ্তাহের ডেটার সঙ্গে বর্তমান ডেটার তুলনা করা হয়।
সারাংশ
Spark SQL-এ Window Functions ব্যবহার করে আপনি আরও জটিল এবং উন্নত ডেটা প্রক্রিয়াকরণ করতে পারেন। এটি বিশেষ করে র্যাংকিং, রানিং টোটাল, অ্যাগ্রিগেশন এবং সময়ভিত্তিক বিশ্লেষণের জন্য অত্যন্ত কার্যকরী। উইন্ডো ফাংশন ব্যবহার করে আপনি বড় ডেটাসেটের ওপর আরো বিস্তারিত এবং অগ্রগতির ভিত্তিতে অ্যানালাইসিস করতে সক্ষম হন।
Read more