হিভে বিভাজন এবং একটি টেবিল বালতি করার মধ্যে পার্থক্য কী?


129

আমি জানি যে উভয়ই টেবিলের একটি কলামে সঞ্চালিত হয় তবে প্রতিটি ক্রিয়াকলাপ কীভাবে আলাদা।

উত্তর:


247

পার্টিশনিং ডেটা প্রায়শই আনুভূমিকভাবে লোড বিতরণের জন্য ব্যবহৃত হয়, এতে পারফরম্যান্স সুবিধা রয়েছে এবং লজিক্যাল ফ্যাশনে ডেটা সংগঠিত করতে সহায়তা করে। উদাহরণ : যদি আমরা একটি বৃহত 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.


4
ধন্যবাদ নবনীত। যাইহোক, আপনি কীভাবে পার্টিশন দিয়ে বকেটিং ঘটে তা বিশদভাবে বলতে পারেন? মনে করুন আমরা যদি ক্লাসড বাই ক্লজ-এর 32 বালতি নির্দিষ্ট করি এবং ক্রিয়েট টেবিল বিবৃতিতে পার্টিশন ক্লজও থাকে, পার্টিশন এবং বালতি কীভাবে একসাথে পরিচালিত হবে? পার্টিশনের সংখ্যা 32 এর মধ্যে সীমাবদ্ধ থাকবে? বা প্রতিটি বিভাজনের জন্য, 32 টি বালতি তৈরি করা হবে? প্রতিটি বালতি কি এইচডিএফএস ফাইল?
sgsi

12
একটি মুরগির টেবিল পার্টিশন এবং বকেটিং উভয় থাকতে পারে। আপনার বিভাজন বিভাগের উপর ভিত্তি করে, প্রতিটি পার্টিশনের জন্য 32 টি বালতি তৈরি করা হবে। হ্যাঁ এইচডিএফএস ফাইল।
নবনি কুমার

7
@sgsi পার্টিশন একটি ফোল্ডার, বালতি একটি ফাইল।
বামজয়িন

12
রেকর্ডের জন্য, এই উত্তরটি প্রোগ্রামিং হাইভের পাঠ্য (ও'রেলি, 2012) থেকে প্রাপ্ত।
আইয়ানমুক

1
আমি এই লিঙ্কটি দরকারী বলে মনে করি। এটিতে এমন তথ্য রয়েছে যা এই উত্তরের আরও মান যোগ করবে। linkedin.com/pulse/...
অ্যালেক্স রাজ Kaliamoorthy

129

পূর্বের ব্যাখ্যাগুলি থেকে কিছু বিশদ অনুপস্থিত। পার্টিশন এবং বকেটিং কীভাবে কাজ করে তা আরও ভালভাবে বুঝতে, আপনার কীভাবে ডেভগুলিতে মুরগি সংরক্ষণ করা হয় তা লক্ষ্য করা উচিত। যাক আপনি একটি টেবিল আছে

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 বালতি থাকবে।

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

সুতরাং, যখন ক্ষেত্রের উচ্চ কার্ডিনালিটি থাকে এবং বালতিগুলির মধ্যে ডেটা সমানভাবে বিতরণ করা হয় তখন বালতিটি ভাল কাজ করে। পার্টিশন ক্ষেত্রের কার্ডিনালিটি খুব বেশি না হলে পার্টিশনটি সর্বোত্তম কাজ করে।

এছাড়াও, আপনি একটি আদেশ দিয়ে একাধিক ক্ষেত্রগুলিতে বিভাজন করতে পারেন (বছর / মাস / দিন একটি ভাল উদাহরণ), যখন আপনি কেবল একটি ক্ষেত্রে বালতি করতে পারেন


আপনি দয়া করে উদাহরণস্বরূপ SorTED-BY এর সাথে ক্লাস্টার্ড-বাই আচরণ সম্পর্কে ব্যাখ্যা করতে পারেন? আমার উদাহরণ অনুসারে আমি দেখতে পেয়েছি सॉर्टড-বাই কিছুই করছে না। আমি কি কিছু মিস করছি?
জগদীশ তাল্লুরি

2
এক্স দ্বারা ক্লাস্টারড, এক্স এর মাধ্যমে বিতরণ লেখার মতো, এক্স এর মাধ্যমে বাছাই করা, y ( cwiki.apache.org/confluence/display/Hive/… দেখুন ) সুতরাং ক্লাস্টারড বাই দ্বারা SORT যুক্ত করার কোনও প্রভাব নেই।
রবার্তো কঙ্গিউ

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

বাছাই করা মানে ডিস্ট্রিবিউটড বাই দ্বারা ব্যবহার করা। উদাহরণস্বরূপ, আপনি ব্যবহারকারীর আইডি দ্বারা বিতরণ করতে এবং বালতির মধ্যে সময় অনুসারে বাছাই করতে পারেন। ক্লাস্টার বাই কেবলমাত্র একটি শর্টকাট যখন সোর্টেড বাই বা দ্বারা বিতরণ করা ক্লকটি একই রকম হয়। কেবলমাত্র আমি ভাবতে পারি যদি আপনি x, y দিয়ে বিতরণ করেন এবং x, y এবং z অনুসারে বাছাই করেন
রবার্তো কঙ্গিউ

আপনি "আপনি কেবল একটি ক্ষেত্রে বালতি দিতে পারেন" বলতে কী বোঝায় তা আমি নিশ্চিত নই। আমি মনে করি হ্যাশিং ফাংশনটি কেবলমাত্র সমস্ত ক্ষেত্রের মধ্যে নিয়ে এবং তাদের একত্রিত করে একাধিক ক্ষেত্র দ্বারা বালতি করা সম্ভব।
ইস্তান

18

আমি মনে করি আমি এই প্রশ্নের উত্তর দিতে দেরি করেছি, তবে এটি আমার ফিডে আসতে থাকবে।

নবনিত দুর্দান্ত উত্তর দিয়েছেন। এতে দৃশ্যত যুক্ত হচ্ছে।

পার্টিশনটি ডেটা অপসারণে সহায়তা করে, যেখানে WHERE ধারাটিতে ব্যবহার করা হয়, যেখানে বুকটিং যেমন প্রতিটি পার্টিশনে ডেটা একাধিক ফাইলে সংগঠিত করতে সহায়তা করে, তাই একই সেট ডেটা সর্বদা একই বালতিতে লিখিত থাকে। কলামগুলিতে যোগ দিতে অনেক সহায়তা করে।

মনে করুন, আপনার কাছে পাঁচটি কলাম, নাম, সার্ভার_ডেট, কিছু_কোলো 3, কিছু_কোল 4 এবং কিছু_কোলো 5 সহ একটি টেবিল রয়েছে। অনুমান, আপনার উপর টেবিল করা পার্টিশনের server_date এবং এর bucketed নাম 10 বাকেট কলাম, আপনার ফাইলের গঠন নিচে মত দেখাবে।

  1. server_date = Xyz
    • 00000_0
    • 00001_0
    • 00002_0
    • ........
    • 00010_0

এখানে সার্ভার_ডেট = xyz হ'ল পার্টিশন এবং প্রতিটি পার্টিশনের মধ্যে 000 ফাইলগুলি বালতি। বালতিগুলি কয়েকটি হ্যাশ ফাংশনের উপর ভিত্তি করে গণনা করা হয়, সুতরাং নাম = স্যান্ডি সহ সারি সর্বদা একই বালতিতে চলে যাবে।


2
উপরের উত্তরে রবার্তোর মতে সার্ভার_ডেট পার্টিশন করা একটি খারাপ উদাহরণ হবে কারণ এর কার্ডিনালিটির মানটি বেশি। এবং তাই আপনার এইচডিএফএসে অনেকগুলি ফোল্ডার শেষ হবে।
গৌরাঙ্গ শাহ

সার্ভার_ডেটের উদাহরণ হিসাবে এখানে উল্লেখ করা হয়েছে। বাস্তব বিশ্বে, পার্টিশনটি সাধারণত রবার্তো দ্বারা চিত্রিত হিসাবে তারিখটি বছর / মাস / দিনে বিভক্ত হয়ে ঘটে। এটি এমনই হওয়া উচিত।
প্রিয়েশ

17

মধুযন্ত্র বিভাজন:

পার্টিশন একটি টেবিল কলাম (গুলি) এর মানের ভিত্তিতে বৃহত পরিমাণে ডেটা একাধিক টুকরোতে বিভক্ত করে।

ধরে নিন যে আপনি সারা বিশ্বে লোকদের তথ্য প্রায় 196+ দেশ জুড়ে প্রায় 500 কোটি এন্ট্রি ছড়িয়ে রেখেছেন। আপনি যদি কোনও বিশেষ দেশ (ভ্যাটিকান শহর) থেকে লোকদের জিজ্ঞাসা করতে চান, বিভাজনের অভাবে, আপনাকে কোনও দেশের হাজার হাজার প্রবেশাধিকার আনতে এমনকি সমস্ত 500 কোটি এন্ট্রি স্ক্যান করতে হবে। আপনি যদি দেশের উপর ভিত্তি করে সারণীটি বিভক্ত করেন তবে আপনি কেবলমাত্র একটি দেশ বিভাগের জন্য ডেটা পরীক্ষা করে টিউন অনুসন্ধান প্রক্রিয়াটি সূক্ষ্ম করতে পারেন। মৌচাকের পার্টিশন কলাম (গুলি) মানের জন্য একটি পৃথক ডিরেক্টরি তৈরি করে।

পেশাদাররা:

  1. এক্সিকিউশন লোড অনুভূমিকভাবে বিতরণ করুন
  2. ডেটা কম পরিমাণে পার্টিশনের ক্ষেত্রে প্রশ্নগুলির দ্রুত সম্পাদন। উদাহরণস্বরূপ, " ভ্যাটিকান শহর " থেকে জনসংখ্যার পুরো জনসংখ্যার অনুসন্ধানের পরিবর্তে খুব দ্রুত ফিরে আসে।

কনস:

  1. অনেকগুলি ছোট পার্টিশন তৈরির সম্ভাবনা - অনেকগুলি ডিরেক্টরি।
  2. প্রদত্ত পার্টিশনের জন্য কম ভলিউম ডেটার জন্য কার্যকর। তবে গ্রুপের মতো কিছু প্রশ্ন উচ্চ মাত্রায় ডেটা কার্যকর করতে এখনও অনেক সময় নেয়। উদাহরণস্বরূপ, ভ্যাটিকান শহরের জনসংখ্যার বিভাজনের তুলনায় চীনের জনসংখ্যার গোষ্ঠীকরণের ক্ষেত্রে অনেক বেশি সময় লাগবে। পার্টিশন কোনও বিশেষ পার্টিশনের মানের দিকে ডেটা স্কুই করার ক্ষেত্রে প্রতিক্রিয়াশীলতার সমস্যা সমাধান করে না।

মাতাল বোকিং:

বুকিং ডেটাটিকে আরও পরিচালনাযোগ্য বা সমান অংশে বিভক্ত করে।

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

পেশাদাররা

  1. প্রতিটি বিভাজনে সমান পরিমাণে ডেটা থাকার কারণে মানচিত্রের পাশের অংশগুলি দ্রুততর হবে।
  2. পার্টিশনের মতো দ্রুততর প্রশ্নের উত্তর

কনস

  1. আপনি টেবিল তৈরির সময় বালতিগুলির সংখ্যা নির্ধারণ করতে পারেন তবে সমান পরিমাণ ভলিউম লোড করা প্রোগ্রামারদের দ্বারা ম্যানুয়ালি করাতে হবে।

9

.োকার আগে 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_idmodulo 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()হ্যাশ ফাংশন হিসাবে স্ট্রিংয়ের জাভা ব্যবহার করে ? প্রোগ্রামার কি হ্যাশ ফাংশনটি বেছে নিতে পারে?
ডন স্মিথ

স্পষ্টতই (এবং আমার পরীক্ষাগুলি অনুসারে) মধুশক্তি জাভার হ্যাশকোড () পদ্ধতিতে একটি প্রকরণ ব্যবহার করে: github.com/apache/hive/blob/release-1.1.0/serde/src/java/org/… । এটি এখানে উল্লেখ করা হয়েছিল: স্ট্যাকওভারফ্লো / প্রশ্ন / 30594038/…
ডন স্মিথ

3

পার্থক্যটি হচ্ছে বুকটিং ফাইলগুলি কলাম নাম দ্বারা বিভক্ত করে, এবং পার্টিশনটি ফাইলগুলি টেবিলের অভ্যন্তরে একটি নির্দিষ্ট মান দ্বারা বিভক্ত করে

আশা করি আমি এটি সঠিকভাবে সংজ্ঞায়িত করেছি


0

এখানে দুর্দান্ত প্রতিক্রিয়া রয়েছে। পার্টিশন এবং বালতিগুলির মধ্যে পার্থক্য স্মরণে রাখতে আমি এটি সংক্ষিপ্ত রাখতে চাই।

আপনি সাধারণত কম অনন্য কলামে বিভাজন। এবং সর্বাধিক অনন্য কলামে বালতি।

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


-1

হাইভ টেবিলের পার্টিশনগুলি নীচের কারণে অত্যন্ত প্রস্তাবিত -

  • Hive সারণিতে সন্নিবেশ করা দ্রুত হওয়া উচিত (যেমন এটি পার্টিশনে ডেটা লিখতে একাধিক থ্রেড ব্যবহার করে)
  • হাইভ টেবিল থেকে প্রশ্নগুলি কম বিলম্বের সাথে দক্ষ হওয়া উচিত।

উদাহরণ: -

অনুমান করুন যে ইনপুট ফাইল (১০০ গিগাবাইট) অস্থায়ী-মাতাল-টেবিলের মধ্যে লোড হয়েছে এবং এতে বিভিন্ন ভৌগলিক জুড়ে থাকা ব্যাংক ডেটা রয়েছে।

পার্টিশন ছাড়াই মধুচক্রের ছক

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)

পেশাদার - দ্রুত সন্নিবেশ। দ্রুত জিজ্ঞাসা।

কনস - বকেটিং আরও ফাইল তৈরি করবে। কিছু নির্দিষ্ট ক্ষেত্রে অনেকগুলি ছোট ফাইল নিয়ে সমস্যা হতে পারে

আশা করি এটি সাহায্য করবে !!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.