हाइव व्यू और इंडेक्सिंग: उदाहरणों सहित निर्माण

⚡ स्मार्ट सारांश

हाइव में व्यू सहेजे गए क्वेरी होते हैं जो रीड-ओनली टेबल की तरह व्यवहार करते हैं, जबकि इंडेक्स एक कॉलम के पॉइंटर होते हैं जो लुकअप को गति देते हैं, और दोनों को यहां दिखाए गए छोटे हाइवक्यूएल स्टेटमेंट के साथ बनाया जाता है।

  • ️ यह दृष्टिकोण तार्किक है: एक व्यू केवल अपने SELECT स्टेटमेंट को मेटास्टोर में संग्रहीत करता है, इसलिए यह स्वयं कोई डिस्क स्थान नहीं लेता है।
  • 🔒 डिज़ाइन के अनुसार केवल पढ़ने योग्य: किसी व्यू को LOAD, INSERT या ALTER का लक्ष्य नहीं बनाया जा सकता, क्योंकि Hive प्रत्येक क्वेरी पर इसका नए सिरे से मूल्यांकन करता है।
  • 📍 सूचकांक डेटा को इंगित करता है: इंडेक्स एक कॉलम वैल्यू का पॉइंटर होता है जो हाइव को पूरी टेबल के बजाय फाइल के एक हिस्से को पढ़ने की अनुमति देता है।
  • ️ दो संचालक: कॉम्पैक्ट इंडेक्सिंग उच्च-कार्डिनैलिटी वाले कॉलम के लिए उपयुक्त है और बिटमैप इंडेक्सिंग कम विशिष्ट मानों वाले कॉलम के लिए उपयुक्त है।
  • 🔄 मैन्युअल पुनर्निर्माण: इंडेक्स कभी भी स्वचालित रूप से रीफ्रेश नहीं होता है, इसलिए बेस टेबल में बदलाव होने के बाद ALTER INDEX REBUILD कमांड चलाना आवश्यक है।
  • 🚫 Hive 3.0 में हटा दिया गया: HIVE-18448 के तहत इंडेक्सिंग को हटा दिया गया था, और इसके स्थान पर मैटेरियलाइज्ड व्यू, ORC या Parquet स्टोरेज और पार्टीशनिंग का उपयोग किया जाता है।

Hive में व्यू और इंडेक्स को उदाहरणों सहित समझाया गया है।

दृश्य क्या है?

व्यू टेबल के समान होते हैं और इन्हें आवश्यकताओं के आधार पर बनाया जाता है। व्यू एक विशुद्ध रूप से तार्किक ऑब्जेक्ट है जिसका अपना कोई स्टोरेज नहीं होता: हाइव मेटास्टोर में केवल क्वेरी टेक्स्ट रखता है और व्यू को संदर्भित किए जाने पर हर बार उसका मूल्यांकन करता है।

  • हम किसी भी परिणाम सेट डेटा को हाइव में एक दृश्य के रूप में सहेज सकते हैं
  • इसका उपयोग व्यूज में उपयोग किए जाने वाले समान है। एसक्यूएल
  • व्यू केवल पढ़ने योग्य होता है, इसलिए इस पर डेटा लिखने वाले LOAD, INSERT या ALTER स्टेटमेंट लागू नहीं किए जा सकते।

दृश्य का निर्माण:

सिंटेक्स:

Create VIEW <VIEWNAME> AS SELECT

पूर्ण रूप से प्रलेखित फॉर्म में IF NOT EXISTS क्लॉज़ और एक वैकल्पिक कॉलम सूची भी स्वीकार की जाती है, जो तब उपयोगी होती है जब SELECT सूची में साधारण कॉलम नामों के बजाय एक्सप्रेशन होते हैं।

उदाहरण:

Hive>Create VIEW Sample_View AS SELECT * FROM employees WHERE salary>25000

इस उदाहरण में, हम Sample_View नामक व्यू बना रहे हैं, जो उन सभी पंक्तियों के मान प्रदर्शित करता है जिनमें वेतन फ़ील्ड का मान 25000 से अधिक है। फ़िल्टर व्यू के अंदर ही मौजूद है, इसलिए Sample_View से डेटा चुनने वाली कोई भी क्वेरी केवल उन्हीं पंक्तियों को देख पाएगी।

इंडेक्स क्या है?

इंडेक्स किसी टेबल के किसी विशेष कॉलम नाम के लिए पॉइंटर होते हैं। इंडेक्स का उद्देश्य लुकअप स्पीड को बेहतर बनाना है: इसके बिना, किसी प्रेडिकेट वाली क्वेरी जैसे कि जहां tab1.col1 = 10 यह पूरी टेबल या पार्टीशन को लोड करता है और प्रत्येक पंक्ति को प्रोसेस करता है, जबकि col1 पर एक इंडेक्स Hive को फ़ाइल के केवल एक हिस्से को पढ़ने की अनुमति देता है।

  • उपयोगकर्ता को मैन्युअल रूप से सूचकांक परिभाषित करना होगा
  • जहां भी हम इंडेक्स बनाते हैं, इसका मतलब है कि हम टेबल के किसी विशेष कॉलम नाम के लिए एक पॉइंटर बना रहे हैं।
  • तालिका में मौजूद कॉलम में किए गए किसी भी बदलाव को कॉलम नाम पर बनाए गए इंडेक्स मान का उपयोग करके संग्रहीत किया जाता है।

यह गति वृद्धि मुफ्त नहीं है। इंडेक्स बनाने में अतिरिक्त प्रोसेसिंग लागत आती है, और इंडेक्स स्वयं डिस्क स्थान घेरता है जिसे टेबल के साथ-साथ बनाए रखना पड़ता है।

सिंटेक्स:

Create INDEX <INDEX_NAME> ON TABLE <TABLE_NAME(column names)>

उदाहरण:

Create INDEX sample_Index ON TABLE guruhive_internaltable(id)

यहां हम गुरुहाइव_इंटरनलटेबल टेबल पर आईडी नाम के कॉलम के लिए एक इंडेक्स बना रहे हैं। ध्यान दें कि इंडेक्सिंग का समर्थन करने वाले रिलीज़ पर एक पूर्ण स्टेटमेंट के लिए इंडेक्स-हैंडलर क्लॉज़ की भी आवश्यकता होती है, जिसे अगले सेक्शन में विस्तार से दिखाया गया है।

Hive में View और Index के बीच अंतर

व्यू और इंडेक्स को अक्सर एक साथ पेश किया जाता है क्योंकि दोनों एक मौजूदा टेबल के ऊपर काम करते हैं, लेकिन वे अलग-अलग समस्याओं का समाधान करते हैं। व्यू क्वेरी द्वारा देखी जाने वाली चीज़ को बदलता है, जबकि इंडेक्स यह बदलता है कि हाइव उसे कितनी जल्दी ढूंढता है। नीचे दी गई तालिका इन दोनों की तुलना करती है।

पहलू देखें सूची
यह क्या संग्रहीत करता है मेटास्टोर में केवल SELECT स्टेटमेंट डेटा के पॉइंटर्स को रखने वाली एक अलग इंडेक्स टेबल
उद्देश्य क्वेरी द्वारा लौटाए जाने वाले परिणामों को सरल बनाएं या सीमित करें। किसी विधेय के लिए स्कैन किए गए डेटा की मात्रा कम करें
डिस्क की लागत कोई नहीं अतिरिक्त स्टोरेज और डेटा में बदलाव के बाद रीबिल्ड की सुविधा
पहुंच लिखें केवल पढ़ने के लिए सीधे तौर पर क्वेरी नहीं की जाती; ऑप्टिमाइज़र इसका उपयोग करता है।
वर्तमान स्थिति पूरा समर्थन किया Hive 3.0 में हटा दिया गया

व्यवहार में, पठनीयता और पहुंच नियंत्रण के लिए एक व्यू बनाया जाता है, और एक इंडेक्स विशुद्ध रूप से एक चयनात्मक कॉलम पर प्रदर्शन के लिए बनाया जाता है।

Hive में इंडेक्स के प्रकार और सिंटैक्स

Hive 2.x तक के रिलीज़ में दो इंडेक्स हैंडलर शामिल थे, और हैंडलर का नाम अनिवार्य AS क्लॉज़ में दिया गया है। कॉम्पैक्ट इंडेक्सिंग Hive 0.7.0 में और बिटमैप इंडेक्सिंग Hive 0.8.0 में आई।

  • संक्षिप्त सूचकांक: यह प्रत्येक मान के स्थान को रिकॉर्ड करने के बजाय, उस मान को उस HDFS ब्लॉक के पते के साथ संग्रहीत करता है जिसमें वह मान मौजूद है। यह कई अलग-अलग मानों वाले कॉलम के लिए उपयुक्त है।
  • बिटमैप इंडेक्स: यह प्रत्येक विशिष्ट मान के लिए एक बिटमैप संग्रहीत करता है, जो कि उन कॉलम के लिए सामान्य दृष्टिकोण है जिनमें केवल कुछ ही विशिष्ट मान होते हैं, जैसे कि स्थिति या लिंग ध्वज।

एक कॉम्पैक्ट इंडेक्स को निम्नानुसार बनाया, सूचीबद्ध किया और हटाया जाता है:

CREATE INDEX table01_index ON TABLE table01 (column2) AS 'COMPACT';
SHOW INDEX ON table01;
DROP INDEX table01_index ON table01;

WITH DEFERRED REBUILD विकल्प इंडेक्स को बिना पॉपुलेट किए रजिस्टर करता है, इसलिए ALTER INDEX के साथ बिल्ड को अलग से शेड्यूल किया जा सकता है। बिटमैप इंडेक्स भी इसी तरह बनाया जाता है, बस हैंडलर का नाम अलग होता है:

CREATE INDEX table03_index ON TABLE table03 (column4) AS 'BITMAP' WITH DEFERRED REBUILD;
ALTER INDEX table03_index ON table03 REBUILD;
SHOW FORMATTED INDEX ON table03;
DROP INDEX table03_index ON table03;

इंडेक्स स्वचालित रूप से रीफ्रेश नहीं होता है। जब भी बेस टेबल में नया डेटा आता है, तो ALTER INDEX … REBUILD कमांड को फिर से चलाना पड़ता है, और पार्टीशन वाली टेबल में रीबिल्ड को एक ही पार्टीशन तक सीमित किया जा सकता है।

Hive 3.0 में इंडेक्सिंग क्यों हटाई गई?

HIVE-18448 के तहत संस्करण 3.0 में Hive से इंडेक्सिंग हटा दी गई थी, इसलिए वर्तमान क्लस्टर पर CREATE INDEX, SHOW INDEX और DROP INDEX कमांड मौजूद नहीं हैं। कॉलम स्टोरेज और लागत-आधारित ऑप्टिमाइज़र के परिपक्व होने के बाद इस सुविधा को फिर से बनाने की लागत शायद ही कभी सार्थक रही। इसके स्थान पर तीन वैकल्पिक समाधान उपलब्ध हैं जो समान कार्य करते हैं।

  • साकार दृश्य: Hive 3.0.0 में पेश किया गया, एक भौतिक दृश्य यह क्वेरी के पूर्व-गणना किए गए परिणाम को संग्रहीत करता है और ऑप्टिमाइज़र स्वचालित रूप से इसके आधार पर आने वाली क्वेरी को पुनः लिखता है।
  • स्तंभ-आधारित फ़ाइल प्रारूप: ORC और Parquet में उनके अपने हल्के इंडेक्स और न्यूनतम/अधिकतम सांख्यिकी होते हैं, इसलिए रीडर बिना किसी उपयोगकर्ता-परिभाषित इंडेक्स के पूरी स्ट्राइप्स, ब्लॉक या फाइलों को छोड़ सकता है।
  • विभाजन और बकेट: विभाजन और बकेटिंग डायरेक्टरी और फ़ाइल स्तर पर डेटा को छाँटें, जिससे आमतौर पर इंडेक्स की तुलना में कहीं अधिक इनपुट हट जाता है।

Hive 2.x पर इंडेक्स अभी भी मान्य है, लेकिन नए काम के लिए ऊपर दिए गए विकल्पों में से किसी एक का उपयोग करना बेहतर होगा।

अक्सर पूछे जाने वाले प्रश्न

DROP VIEW view_name इसे हटा देता है, और ALTER VIEW view_name RENAME TO new_name इसका नाम बदल देता है। चूंकि एक व्यू में कोई डेटा नहीं होता है, इसलिए इसे हटा दिया जाता है।ping बेस टेबल को कभी छुआ नहीं जाता; केवल मेटास्टोर प्रविष्टि गायब हो जाती है।

मैटेरियलाइज्ड व्यू पूर्व-गणना किए गए क्वेरी परिणाम को वास्तविक डेटा के रूप में संग्रहीत करता है, इसलिए इसमें डिस्क स्थान की आवश्यकता होती है और इसे रीबिल्ड करने की आवश्यकता होती है। एक सामान्य व्यू केवल क्वेरी टेक्स्ट को संग्रहीत करता है और प्रत्येक संदर्भ पर इसकी पुनः गणना की जाती है।

नहीं। मेटास्टोर केवल SELECT स्टेटमेंट और हल किए गए कॉलम की सूची रखता है, इससे अधिक कुछ नहीं। प्रत्येक संदर्भ अंतर्निहित क्वेरी को पुनः चलाता है, यही कारण है कि धीमे जॉइन पर बना व्यू धीमा ही रहता है।

Hive 0.12.0 और उससे पहले के संस्करणों में, CREATE INDEX और DROP INDEX के लिए नाम केस-सेंसिटिव थे, जबकि ALTER INDEX के लिए लोअरकेस की आवश्यकता थी। Hive 0.13.0 ने सभी स्टेटमेंट के लिए इंडेक्स नामों को केस-इनसेंसिटिव बना दिया।

हां, किसी भी आधुनिक क्लस्टर पर। पार्टीशन प्रूनिंग स्कैन शुरू होने से पहले पूरी डायरेक्टरी को हटा देती है और बकेटिंग जॉइन या सैंपल को विशिष्ट फाइलों तक सीमित कर देती है, जो आमतौर पर इंडेक्स टेबल से बेहतर परिणाम देती है।

मशीन लर्निंग टूल क्वेरी लॉग का विश्लेषण करते हैं, चयनात्मकता और आवृत्ति के आधार पर प्रेडिकेट कॉलम को रैंक करते हैं, और यह सुझाव देते हैं कि मैटेरियलाइज्ड व्यू या पार्टीशन स्कीम कहाँ उपयोगी होगी। प्रत्येक सुझाव को लागू करने से पहले EXPLAIN प्लान के विरुद्ध सत्यापित करें।

यह एक छोटे से कमेंट से भी CREATE VIEW स्टेटमेंट को विश्वसनीय रूप से उत्पन्न करता है। कृपया वर्शन से संबंधित किसी भी जानकारी की जांच कर लें, क्योंकि यह अभी भी CREATE INDEX सिंटैक्स उत्पन्न करता है जिसे Hive 3.0 या बाद के वर्शन वाला क्लस्टर पूरी तरह से अस्वीकार कर देता है।

इंडेक्स पॉइंटर्स की एक अलग टेबल होती है, और बेस टेबल में बदलाव होने पर हाइव इसे कभी रीफ्रेश नहीं करता। रीबिल्ड न होने पर पॉइंटर्स पुराने हो जाते हैं, इसलिए ऑप्टिमाइज़र या तो इंडेक्स को छोड़ देता है या पुराने मैच लौटाता है।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: