উত্তর:
পার্টিশনিং ডেটা প্রায়শই আনুভূমিকভাবে লোড বিতরণের জন্য ব্যবহৃত হয়, এতে পারফরম্যান্স সুবিধা রয়েছে এবং লজিক্যাল ফ্যাশনে ডেটা সংগঠিত করতে সহায়তা করে। উদাহরণ : যদি আমরা একটি বৃহত employee
টেবিলের সাথে কাজ করে থাকি এবং প্রায়শই WHERE
এমন ধারাগুলির সাথে অনুসন্ধান চালাই যা ফলাফলগুলি কোনও নির্দিষ্ট দেশ বা বিভাগের মধ্যে সীমাবদ্ধ করে। একটি দ্রুত কোয়েরি প্রতিক্রিয়া জন্য Hive টেবিল হতে পারে PARTITIONED BY (country STRING, DEPT STRING)
। পার্টিশন টেবিলগুলি পরিবর্তন করে যে কীভাবে ডেভ স্টোরেজ এবং হাইভ স্ট্রাকচারকে এইভাবে পার্টিশন কাঠামোর প্রতিফলন করে সাব-ডিরেক্টরিগুলি তৈরি করবে
... / কর্মচারী / দেশ = এবিসি / ডিপ্ট = এক্সওয়াইজেড ।
যদি কোয়েরি থেকে কর্মচারীর সীমাবদ্ধতা থাকে তবে country=ABC
এটি কেবল একটি ডিরেক্টরিতে থাকা সামগ্রীর স্ক্যান করবে country=ABC
। এটি নাটকীয়ভাবে ক্যোয়ারি পারফরম্যান্সকে উন্নত করতে পারে, তবে কেবলমাত্র পার্টিশন স্কিমই সাধারণ ফিল্টারিং প্রতিফলিত করে। হাইভের মধ্যে পার্টিশন বৈশিষ্ট্যটি খুব দরকারী, তবে একটি নকশা যা অনেকগুলি পার্টিশন তৈরি করে কিছু ক্যোয়ারী অনুকূলিত করতে পারে তবে অন্যান্য গুরুত্বপূর্ণ প্রশ্নের জন্য ক্ষতিকারক হতে পারে। অন্যান্য অপূর্ণতা হ'ল অনেকগুলি পার্টিশন হ'ল বিপুল সংখ্যক হ্যাডোপ ফাইল এবং ডিরেক্টরি যা নামনোডে অকারণে তৈরি হয়েছিল এবং ওভারহেড নেমনোডের উপর পড়ে কারণ এটি অবশ্যই মেমরির মধ্যে ফাইল সিস্টেমের জন্য সমস্ত মেটাডেটা রাখতে হবে।
আরও ম্যানেজমেন্টাল অংশগুলিতে ডেটা সেটগুলি পচানোর জন্য বুকিং হ'ল আরেকটি কৌশল। উদাহরণস্বরূপ, ধরুন একটি টেবিল date
শীর্ষ স্তরের পার্টিশন এবং employee_id
দ্বিতীয় স্তরের পার্টিশন হিসাবে ব্যবহার করে অনেকগুলি ছোট ছোট পার্টিশন তৈরি হয়। পরিবর্তে, যদি আমরা কর্মচারী টেবিলটি বালতি করি এবং employee_id
বকেটিং কলাম হিসাবে ব্যবহার করি , তবে এই কলামটির মান একটি ব্যবহারকারী-সংজ্ঞায়িত নম্বর দ্বারা বালতিতে হ্যাশ হয়ে যাবে। একই সাথে রেকর্ডগুলি employee_id
সর্বদা একই বালতিতে সংরক্ষণ করা হবে। ধরে নিচ্ছি employee_id
বালতির সংখ্যার চেয়ে সংখ্যাটি অনেক বেশি, প্রতিটি বালতিতে অনেকগুলি থাকবে employee_id
। টেবিল তৈরি করার সময় আপনি পছন্দ করতে পারেনCLUSTERED BY (employee_id) INTO XX BUCKETS;
যেখানে XX হ'ল বালতির সংখ্যা। বকেটিংয়ের বিভিন্ন সুবিধা রয়েছে। বালতির সংখ্যা স্থির করা হয়েছে যাতে এটি ডেটার সাথে ওঠানামা করে না। যদি দুটি টেবিল বালতিযুক্ত হয় employee_id
, তবে হিভ যুক্তিযুক্তভাবে সঠিক নমুনা তৈরি করতে পারেন। বকেটিং দক্ষ মানচিত্রের পাশ দিয়ে যোগ দেওয়া ইত্যাদিতে সহায়তা করে etc.
পূর্বের ব্যাখ্যাগুলি থেকে কিছু বিশদ অনুপস্থিত। পার্টিশন এবং বকেটিং কীভাবে কাজ করে তা আরও ভালভাবে বুঝতে, আপনার কীভাবে ডেভগুলিতে মুরগি সংরক্ষণ করা হয় তা লক্ষ্য করা উচিত। যাক আপনি একটি টেবিল আছে
CREATE TABLE mytable (
name string,
city string,
employee_id int )
PARTITIONED BY (year STRING, month STRING, day STRING)
CLUSTERED BY (employee_id) INTO 256 BUCKETS
তারপরে এইচআইভি একটি ডিরেক্টরি স্তরক্রমের মতো ডেটা সংরক্ষণ করবে
/user/hive/warehouse/mytable/y=2015/m=12/d=02
সুতরাং, বিভাজনকালে আপনার সাবধানতা অবলম্বন করতে হবে, কারণ যদি আপনি কর্মচারী_আইডি দ্বারা বিভাজনের জন্য এবং আপনার কয়েক মিলিয়ন কর্মচারী থাকে তবে আপনার ফাইল সিস্টেমে কয়েক মিলিয়ন ডিরেক্টরি রয়েছে। ' কার্ডিনালিটি ' শব্দটি কোনও ক্ষেত্রের কতগুলি সম্ভাব্য মান হতে পারে তা বোঝায়। উদাহরণস্বরূপ, আপনার যদি একটি 'দেশ' ক্ষেত্র থাকে, বিশ্বের দেশগুলি প্রায় 300 হয়, তাই কার্ডিনালিটি 300 ডলার হবে। 'টাইমস্ট্যাম্প_এমএস' এর মতো ক্ষেত্রের জন্য, যা প্রতি মিলিসেকেন্ডে পরিবর্তিত হয়, কার্ডিনালিটি কয়েক বিলিয়ন হতে পারে। সাধারণভাবে, বিভাজনের জন্য কোনও ক্ষেত্র বেছে নেওয়ার সময় এটির উচ্চ কার্ডিনালিটি থাকা উচিত নয়, কারণ আপনি নিজের ফাইল সিস্টেমে অনেকগুলি ডিরেক্টরি ব্যবহার করে শেষ করতে পারেন।
অন্যদিকে ক্লাস্টারিং ওরফে বকেটিং, একটি নির্দিষ্ট সংখ্যক ফাইলের ফলস্বরূপ, যেহেতু আপনি বালতিগুলির সংখ্যা উল্লেখ করেছেন। এইচআইভি যা করবে তা হ'ল ক্ষেত্রটি নেওয়া, একটি হ্যাশ গণনা করা এবং সেই বালতিতে একটি রেকর্ড বরাদ্দ করা। তবে আপনি যদি বলুন যে 256 বালতি এবং আপনি যে ক্ষেত্রটি কিনে চলেছেন তার ক্ষেত্রটির নিম্ন কার্ডিনালিটি রয়েছে (উদাহরণস্বরূপ, এটি মার্কিন যুক্তরাষ্ট্রের রাষ্ট্র, সুতরাং কেবল 50 টি আলাদা মান হতে পারে)? আপনার কাছে ডেটা সহ 50 টি বালতি এবং কোনও ডেটা ছাড়াই 206 বালতি থাকবে।
কেউ কেউ ইতিমধ্যে উল্লেখ করেছে যে কীভাবে পার্টিশনগুলি আপনার জিজ্ঞাসা করছে এমন ডেটার পরিমাণ নাটকীয়ভাবে হ্রাস করতে পারে। সুতরাং আমার উদাহরণ সারণীতে, আপনি যদি কেবল একটি নির্দিষ্ট তারিখ থেকে এগিয়ে জিজ্ঞাসা করতে চান, বছর / মাস / দিন দ্বারা পার্টিশনটি নাটকীয়ভাবে আইওর পরিমাণ হ্রাস করতে চলেছে। আমি মনে করি যে কেউ কেউ আরও উল্লেখ করেছিল যে কীভাবে বোকটিং অন্যান্য টেবিলগুলির সাথে একই বুকটিংয়ের সাথে মিলিত হতে পারে , সুতরাং আমার উদাহরণস্বরূপ, আপনি যদি একই কর্মচারী_আইডিতে দুটি টেবিলে যোগদান করেন তবে মুরগি বালতি দ্বারা যোগ বালতিটি করতে পারে (আরও ভাল) যদি তারা ইতিমধ্যে কর্মী_আইড অনুসারে বাছাই করা হয় যেহেতু এটি ইতিমধ্যে বাছাই করা অংশগুলি একত্রীকরণ করতে চলেছে যা লিনিয়ার সময় ওরফে ও (এন) তে কাজ করে।
সুতরাং, যখন ক্ষেত্রের উচ্চ কার্ডিনালিটি থাকে এবং বালতিগুলির মধ্যে ডেটা সমানভাবে বিতরণ করা হয় তখন বালতিটি ভাল কাজ করে। পার্টিশন ক্ষেত্রের কার্ডিনালিটি খুব বেশি না হলে পার্টিশনটি সর্বোত্তম কাজ করে।
এছাড়াও, আপনি একটি আদেশ দিয়ে একাধিক ক্ষেত্রগুলিতে বিভাজন করতে পারেন (বছর / মাস / দিন একটি ভাল উদাহরণ), যখন আপনি কেবল একটি ক্ষেত্রে বালতি করতে পারেন ।
আমি মনে করি আমি এই প্রশ্নের উত্তর দিতে দেরি করেছি, তবে এটি আমার ফিডে আসতে থাকবে।
নবনিত দুর্দান্ত উত্তর দিয়েছেন। এতে দৃশ্যত যুক্ত হচ্ছে।
পার্টিশনটি ডেটা অপসারণে সহায়তা করে, যেখানে WHERE ধারাটিতে ব্যবহার করা হয়, যেখানে বুকটিং যেমন প্রতিটি পার্টিশনে ডেটা একাধিক ফাইলে সংগঠিত করতে সহায়তা করে, তাই একই সেট ডেটা সর্বদা একই বালতিতে লিখিত থাকে। কলামগুলিতে যোগ দিতে অনেক সহায়তা করে।
মনে করুন, আপনার কাছে পাঁচটি কলাম, নাম, সার্ভার_ডেট, কিছু_কোলো 3, কিছু_কোল 4 এবং কিছু_কোলো 5 সহ একটি টেবিল রয়েছে। অনুমান, আপনার উপর টেবিল করা পার্টিশনের server_date এবং এর bucketed নাম 10 বাকেট কলাম, আপনার ফাইলের গঠন নিচে মত দেখাবে।
এখানে সার্ভার_ডেট = xyz হ'ল পার্টিশন এবং প্রতিটি পার্টিশনের মধ্যে 000 ফাইলগুলি বালতি। বালতিগুলি কয়েকটি হ্যাশ ফাংশনের উপর ভিত্তি করে গণনা করা হয়, সুতরাং নাম = স্যান্ডি সহ সারি সর্বদা একই বালতিতে চলে যাবে।
মধুযন্ত্র বিভাজন:
পার্টিশন একটি টেবিল কলাম (গুলি) এর মানের ভিত্তিতে বৃহত পরিমাণে ডেটা একাধিক টুকরোতে বিভক্ত করে।
ধরে নিন যে আপনি সারা বিশ্বে লোকদের তথ্য প্রায় 196+ দেশ জুড়ে প্রায় 500 কোটি এন্ট্রি ছড়িয়ে রেখেছেন। আপনি যদি কোনও বিশেষ দেশ (ভ্যাটিকান শহর) থেকে লোকদের জিজ্ঞাসা করতে চান, বিভাজনের অভাবে, আপনাকে কোনও দেশের হাজার হাজার প্রবেশাধিকার আনতে এমনকি সমস্ত 500 কোটি এন্ট্রি স্ক্যান করতে হবে। আপনি যদি দেশের উপর ভিত্তি করে সারণীটি বিভক্ত করেন তবে আপনি কেবলমাত্র একটি দেশ বিভাগের জন্য ডেটা পরীক্ষা করে টিউন অনুসন্ধান প্রক্রিয়াটি সূক্ষ্ম করতে পারেন। মৌচাকের পার্টিশন কলাম (গুলি) মানের জন্য একটি পৃথক ডিরেক্টরি তৈরি করে।
পেশাদাররা:
কনস:
মাতাল বোকিং:
বুকিং ডেটাটিকে আরও পরিচালনাযোগ্য বা সমান অংশে বিভক্ত করে।
বিভাজন সহ, কলাম মানগুলির উপর ভিত্তি করে আপনি একাধিক ছোট পার্টিশন তৈরি করতে পারবেন এমন সম্ভাবনা রয়েছে। আপনি যদি বকেটিংয়ের জন্য যান তবে আপনি ডেটা সঞ্চয় করতে বালতি সংখ্যা সীমাবদ্ধ করছেন। এই সংখ্যাটি সারণী তৈরি স্ক্রিপ্টগুলির সময় সংজ্ঞায়িত করা হয়।
পেশাদাররা
কনস
.োকার আগে Bucketing
আমাদের বুঝতে হবে কী Partitioning
তা। আসুন উদাহরণ হিসাবে নীচের টেবিলটি গ্রহণ করি। নোট করুন যে আমি প্রাথমিক স্তরের বোঝার জন্য নীচের উদাহরণে কেবল 12 টি রেকর্ড দিয়েছি। রিয়েল-টাইম পরিস্থিতিতে আপনার কয়েক মিলিয়ন রেকর্ড থাকতে পারে।
পার্টিশনিং
---------------------
Partitioning
তথ্য অনুসন্ধানের সময় পারফরম্যান্স পেতে ব্যবহৃত হয়। উদাহরণস্বরূপ, উপরের সারণীতে, আমরা নীচের স্ক্যুএলটি লিখলে, এটি সারণীতে সমস্ত রেকর্ড স্ক্যান করা দরকার যা কর্মক্ষমতা হ্রাস করে এবং ওভারহেড বৃদ্ধি করে।
select * from sales_table where product_id='P1'
পূর্ণ টেবিল স্ক্যান এড়ানোর জন্য product_id='P1'
এবং product_id
কলামের উপর ভিত্তি করে আমরা কেবলমাত্র সম্পর্কিত রেকর্ডগুলি পড়তে পারি (বিভক্ত মাতালার টেবিলের ফাইলগুলি) একাধিক ফাইলগুলিতে কলামের ভিত্তিতে ভাগ করতে পারি । এর মাধ্যমে মধুচক্র টেবিল ফাইল দুটি ফাইলের সঙ্গে এক বিভক্ত করা হবে product_id='P1'
এবং সঙ্গে অন্যান্য product_id='P2'
। এখন যখন আমরা উপরের ক্যোয়ারীটি সম্পাদন করব তখন এটি কেবল product_id='P1'
ফাইলটি স্ক্যান করবে ।
../hive/warehouse/sales_table/product_id=P1
../hive/warehouse/sales_table/product_id=P2
পার্টিশন তৈরির জন্য সিনট্যাক্সটি নীচে দেওয়া হয়েছে। নোট করুন যে আমাদের product_id
নীচের সিনট্যাক্সে বিভাজনবিহীন কলামগুলির সাথে কলাম সংজ্ঞাটি ব্যবহার করা উচিত নয় । এটি কেবল partitioned by
ধারাতে হওয়া উচিত ।
create table sales_table(sales_id int,trans_date date, amount int)
partitioned by (product_id varchar(10))
কনস : বিভাজন করার সময় আমাদের খুব সতর্ক হওয়া উচিত। অর্থাৎ, এটি কলামগুলির জন্য ব্যবহার করা উচিত নয় যেখানে পুনরাবৃত্তি মানগুলির সংখ্যা খুব কম হয় (বিশেষত প্রাথমিক কী কলাম) কারণ এটি পার্টিশনযুক্ত ফাইলগুলির সংখ্যা বাড়িয়ে তোলে এবং এর জন্য ওভারহেড বৃদ্ধি করে Name node
।
বুকেটিং
------------------ বিভাজন বিভাগে আমি যে উল্লেখ করেছি
Bucketing
তা পরাস্ত করতে ব্যবহৃত হয় cons
। যখন কোনও কলামে খুব কম পুনরাবৃত্তি মান রয়েছে (উদাহরণস্বরূপ - প্রাথমিক কী কলাম) এটি ব্যবহার করা উচিত। এটি আরডিবিএমএসের প্রাথমিক কী কলামে সূচকের ধারণার অনুরূপ। আমাদের সারণীতে, আমরা Sales_Id
বকেটিংয়ের জন্য কলাম নিতে পারি। যখন আমাদের sales_id
কলামটি জিজ্ঞাসা করা দরকার তখন এটি কার্যকর হবে ।
নীচে বকেটিংয়ের বাক্য গঠন রয়েছে।
create table sales_table(sales_id int,trans_date date, amount int)
partitioned by (product_id varchar(10)) Clustered by(Sales_Id) into 3 buckets
এখানে আমরা পার্টিশনের শীর্ষে আরও কয়েকটি ফাইলগুলিতে ডেটা বিভক্ত করব।
যেহেতু আমরা 3
বালতি নির্দিষ্ট করে দিয়েছি , তাই এটি প্রতিটি জন্য 3 টি ফাইলে বিভক্ত হয় product_id
। modulo operator
প্রতিটি অভ্যন্তরে কোন বালতি sales_id
সংরক্ষণ করা উচিত তা নির্ধারণের জন্য এটি অভ্যন্তরীণভাবে ব্যবহার করে । উদাহরণস্বরূপ, জন্য product_id='P1'
, sales_id=1
সংরক্ষণ করা হবে 000001_0 ফাইল (অর্থাত, 1% 3 = 1), sales_id=2
সংরক্ষণ করা হবে 000002_0 ফাইল (অর্থাত, 2% 3 = 2), sales_id=3
সংরক্ষণ করা হবে 000000_0 ফাইল (অর্থাত, 3% 3 = 0) ইত্যাদি
hashCode()
হ্যাশ ফাংশন হিসাবে স্ট্রিংয়ের জাভা ব্যবহার করে ? প্রোগ্রামার কি হ্যাশ ফাংশনটি বেছে নিতে পারে?
পার্থক্যটি হচ্ছে বুকটিং ফাইলগুলি কলাম নাম দ্বারা বিভক্ত করে, এবং পার্টিশনটি ফাইলগুলি টেবিলের অভ্যন্তরে একটি নির্দিষ্ট মান দ্বারা বিভক্ত করে
আশা করি আমি এটি সঠিকভাবে সংজ্ঞায়িত করেছি
এখানে দুর্দান্ত প্রতিক্রিয়া রয়েছে। পার্টিশন এবং বালতিগুলির মধ্যে পার্থক্য স্মরণে রাখতে আমি এটি সংক্ষিপ্ত রাখতে চাই।
আপনি সাধারণত কম অনন্য কলামে বিভাজন। এবং সর্বাধিক অনন্য কলামে বালতি।
উদাহরণস্বরূপ যদি আপনি দেশ, ব্যক্তির নাম এবং তাদের বায়ো-মেট্রিক আইডি সহ বিশ্ব জনসংখ্যাকে বিবেচনা করেন। আপনি অনুমান করতে পারেন, দেশের ক্ষেত্রটি কম অনন্য কলাম হবে এবং বায়ো-মেট্রিক আইডিটি সবচেয়ে অনন্য কলাম হবে। সুতরাং আদর্শভাবে আপনার দেশটি টেবিলটি বিভাজন করা উচিত এবং বায়ো-মেট্রিক আইডি দ্বারা এটি বালতি করা উচিত।
হাইভ টেবিলের পার্টিশনগুলি নীচের কারণে অত্যন্ত প্রস্তাবিত -
উদাহরণ: -
অনুমান করুন যে ইনপুট ফাইল (১০০ গিগাবাইট) অস্থায়ী-মাতাল-টেবিলের মধ্যে লোড হয়েছে এবং এতে বিভিন্ন ভৌগলিক জুড়ে থাকা ব্যাংক ডেটা রয়েছে।
পার্টিশন ছাড়াই মধুচক্রের ছক
Insert into Hive table Select * from temp-hive-table
/hive-table-path/part-00000-1 (part size ~ hdfs block size)
/hive-table-path/part-00000-2
....
/hive-table-path/part-00000-n
এই পদ্ধতির সাথে সমস্যাটি হ'ল - আপনি এই টেবিলটিতে চালিত কোনও প্রশ্নের জন্য এটি পুরো ডেটা স্ক্যান করবে। পার্টিশন এবং বকেটিং ব্যবহৃত হয় এমন অন্যান্য পদ্ধতির তুলনায় প্রতিক্রিয়া সময় বেশি হবে।
পার্টিশনের সাথে মধুচক্রের টেবিল
Insert into Hive table partition(country) Select * from temp-hive-table
/hive-table-path/country=US/part-00000-1 (file size ~ 10 GB)
/hive-table-path/country=Canada/part-00000-2 (file size ~ 20 GB)
....
/hive-table-path/country=UK/part-00000-n (file size ~ 5 GB)
পেশাদাররা - নির্দিষ্ট ভূগোলের লেনদেনের জন্য ডেটা জিজ্ঞাসা করার সময় এখানে কেউ দ্রুত ডেটা অ্যাক্সেস করতে পারে। কনস - প্রতিটি পার্টিশনের মধ্যে ডেটা বিভক্ত করে ডেটা সন্নিবেশ করা / অনুসন্ধান করা আরও উন্নত করা যেতে পারে। নীচে বুকিংয়ের বিকল্পটি দেখুন।
পার্টিশন এবং বকেটিংয়ের সাথে মধুচক্রের টেবিল
দ্রষ্টব্য: মাতালকের টেবিলটি তৈরি করুন ..... "ক্লাস্টার বাই বাই (পার্টিটন_কলাম) 5 টি বালতিতে
Insert into Hive table partition(country) Select * from temp-hive-table
/hive-table-path/country=US/part-00000-1 (file size ~ 2 GB)
/hive-table-path/country=US/part-00000-2 (file size ~ 2 GB)
/hive-table-path/country=US/part-00000-3 (file size ~ 2 GB)
/hive-table-path/country=US/part-00000-4 (file size ~ 2 GB)
/hive-table-path/country=US/part-00000-5 (file size ~ 2 GB)
/hive-table-path/country=Canada/part-00000-1 (file size ~ 4 GB)
/hive-table-path/country=Canada/part-00000-2 (file size ~ 4 GB)
/hive-table-path/country=Canada/part-00000-3 (file size ~ 4 GB)
/hive-table-path/country=Canada/part-00000-4 (file size ~ 4 GB)
/hive-table-path/country=Canada/part-00000-5 (file size ~ 4 GB)
....
/hive-table-path/country=UK/part-00000-1 (file size ~ 1 GB)
/hive-table-path/country=UK/part-00000-2 (file size ~ 1 GB)
/hive-table-path/country=UK/part-00000-3 (file size ~ 1 GB)
/hive-table-path/country=UK/part-00000-4 (file size ~ 1 GB)
/hive-table-path/country=UK/part-00000-5 (file size ~ 1 GB)
পেশাদার - দ্রুত সন্নিবেশ। দ্রুত জিজ্ঞাসা।
কনস - বকেটিং আরও ফাইল তৈরি করবে। কিছু নির্দিষ্ট ক্ষেত্রে অনেকগুলি ছোট ফাইল নিয়ে সমস্যা হতে পারে
আশা করি এটি সাহায্য করবে !!