मुझे लगता है कि मुख्य अंतर जो मैं वर्णन कर सकता हूं वह उन्मुख बनाम कॉलम उन्मुख प्रारूपों को रिकॉर्ड कर सकता है। रिकॉर्ड उन्मुख प्रारूप वे हैं जो हम सभी के लिए उपयोग किए जाते हैं - पाठ फ़ाइलें, सीएसवी, टीएसवी जैसे सीमांकित प्रारूप। AVRO उन की तुलना में थोड़ा ठंडा है क्योंकि यह समय के साथ स्कीमा को बदल सकता है, उदाहरण के लिए किसी रिकॉर्ड से कॉलम जोड़ना या निकालना। विभिन्न प्रारूपों (विशेष रूप से संपीड़न सहित) की अन्य चालों में यह शामिल है कि क्या एक प्रारूप को विभाजित किया जा सकता है - यानी, क्या आप डेटासेट में कहीं से भी रिकॉर्ड का एक ब्लॉक पढ़ सकते हैं और अभी भी यह जान सकते हैं कि यह स्कीमा है? लेकिन यहाँ पर पर्कट जैसे स्तंभ स्वरूपों पर अधिक विवरण दिया गया है।
लकड़ी की छत, और अन्य स्तंभ प्रारूप बहुत ही कुशलता से एक सामान्य Hadoop स्थिति को संभालते हैं। तालिकाओं (डेटासेट) के कई सामान्य कॉलम होना आम बात है, जो आप अच्छी तरह से डिज़ाइन किए गए रिलेशनल डेटाबेस में अपेक्षा करेंगे - सौ या दो सौ कॉलम असामान्य नहीं हैं। ऐसा इसलिए है क्योंकि हम अक्सर Hadoop का उपयोग संबंधपरक स्वरूपों से डेटा को असामान्य बनाने के लिए एक जगह के रूप में करते हैं - हां, आपको बहुत सारे दोहराया मान मिलते हैं और कई टेबल सभी एक ही में समतल हो जाते हैं। लेकिन यह बहुत आसान हो जाता है क्योंकि सभी जॉइंट्स को काम करना आसान हो जाता है। अन्य फायदे हैं जैसे कि स्टेट-इन-टाइम डेटा को बनाए रखना। तो वैसे भी एक टेबल में कॉलम का एक नाव लोड होना आम है।
मान लें कि 132 कॉलम हैं, और उनमें से कुछ वास्तव में लंबे टेक्स्ट फ़ील्ड हैं, प्रत्येक अलग कॉलम एक दूसरे का अनुसरण करते हैं और शायद प्रति रिकॉर्ड 10K का उपयोग करते हैं।
एसक्यूएल दृष्टिकोण के साथ इन तालिकाओं को क्वेरी करना आसान है, यह आम है कि आप उन कुछ सौ-प्लस कॉलमों के आधार पर रिकॉर्ड की कुछ रेंज प्राप्त करना चाहेंगे। उदाहरण के लिए, आप चाहते हो सकता है कि फरवरी और मार्च के सभी रिकॉर्ड बिक्री वाले ग्राहकों के लिए> $ 500 हो।
एक पंक्ति प्रारूप में ऐसा करने के लिए क्वेरी को डेटासेट के हर रिकॉर्ड को स्कैन करना होगा। पहली पंक्ति पढ़ें, रिकॉर्ड को फ़ील्ड्स (कॉलम) में पार्स करें और दिनांक और बिक्री कॉलम प्राप्त करें, इसे अपने परिणाम में शामिल करें यदि यह स्थिति को संतुष्ट करता है। दोहराएँ। यदि आपके पास 10 साल (120 महीने) का इतिहास है, तो आप उन महीनों में से 2 खोजने के लिए हर एक रिकॉर्ड पढ़ रहे हैं। बेशक यह वर्ष और महीने पर एक विभाजन का उपयोग करने का एक शानदार अवसर है, लेकिन फिर भी, आप पढ़ रहे हैं और उन दो महीनों के लिए प्रत्येक रिकॉर्ड / पंक्ति का 10K पार्स कर रहे हैं ताकि ग्राहक की बिक्री $ 500 हो।
एक स्तंभ प्रारूप में, रिकॉर्ड का प्रत्येक स्तंभ (फ़ील्ड) अपनी तरह के अन्य लोगों के साथ संग्रहीत किया जाता है, डिस्क पर कई अलग-अलग ब्लॉकों में फैलता है - एक साथ वर्ष के लिए कॉलम, एक साथ महीने के लिए कॉलम, ग्राहक कर्मचारी हैंडबुक के लिए कॉलम (या अन्य) लंबा पाठ), और अन्य सभी जो उन सभी रिकॉर्ड को डिस्क पर अपनी अलग जगह में इतना विशाल बनाते हैं, और निश्चित रूप से एक साथ बिक्री के लिए कॉलम। खैर बिल्ली, तारीख और महीने संख्याएं हैं, और इसलिए बिक्री हैं - वे बस कुछ बाइट्स हैं। क्या यह बहुत अच्छा नहीं होगा अगर हमें केवल प्रत्येक रिकॉर्ड के लिए कुछ बाइट्स पढ़ने के लिए निर्धारित करना था जो हमारी क्वेरी से मेल खाता हो? बचाव के लिए कॉलमिनेर स्टोरेज!
विभाजन के बिना, हमारी क्वेरी को संतुष्ट करने के लिए आवश्यक छोटे क्षेत्रों को स्कैन करना सुपर-फास्ट है - वे सभी रिकॉर्ड के क्रम में हैं, और सभी एक ही आकार के हैं, इसलिए डिस्क में शामिल रिकॉर्ड्स के लिए बहुत कम डेटा की जांच होती है। उस कर्मचारी पुस्तिका और अन्य लंबे पाठ क्षेत्रों के माध्यम से पढ़ने की आवश्यकता नहीं है - बस उन्हें अनदेखा करें। इसलिए, पंक्तियों के बजाय एक दूसरे के साथ कॉलम को जोड़कर, आप लगभग हमेशा कम डेटा स्कैन कर सकते हैं। जीत!
लेकिन रुको, यह बेहतर हो जाता है। यदि आपकी क्वेरी को केवल उन मानों और कुछ और जानने की जरूरत है (चलो १०२ स्तंभों में से १० कहते हैं) और उस कर्मचारी हैंडबुक कॉलम के बारे में परवाह नहीं की, एक बार इसे वापस करने के लिए सही रिकॉर्ड उठाया था, तो अब इसे केवल जाना होगा परिणामों में रेंडर करने के लिए आवश्यक 10 कॉलम पर वापस, हमारे डेटासेट में 132 के अन्य 122 को अनदेखा करना। फिर, हम बहुत पढ़ना छोड़ देते हैं।
(नोट: इस कारण से, स्तंभ स्वरूप सीधे रूपांतरण करते समय एक घटिया विकल्प होते हैं, उदाहरण के लिए, यदि आप सभी दो तालिकाओं को एक बड़े (ger) परिणाम में शामिल कर रहे हैं, तो सेट करें कि आप नई तालिका के रूप में सहेज रहे हैं, स्रोत वैसे भी पूरी तरह से स्कैन किया जा रहा है, इसलिए पढ़ने के प्रदर्शन में बहुत अधिक लाभ नहीं है, और क्योंकि स्तंभ स्वरूपों में जहां सामान के बारे में अधिक याद रखने की आवश्यकता है, वे एक समान पंक्ति प्रारूप की तुलना में अधिक मेमोरी का उपयोग करते हैं)।
स्तंभ का एक और लाभ: डेटा चारों ओर फैला हुआ है। एकल रिकॉर्ड प्राप्त करने के लिए, आपके पास 132 ब्लॉक डेटा पर 132 से अधिक विभिन्न स्थानों पर प्रत्येक पढ़ने (और लिखने) डेटा के 132 कर्मचारी हो सकते हैं। समांतर के लिए याय!
और अब क्लिनिक के लिए: कंप्रेशन एल्गोरिदम बहुत बेहतर काम करता है जब यह दोहराए जाने वाले पैटर्न पा सकता है। आप के AABBBBBBCCCCCCCCCCCCCCCC
रूप में संक्षिप्त कर सकते हैं , लेकिन इस मामले में यह ( 2A6B16C
लेकिन ABCABCBCBCBCCCCCCCCCCCCCC
, वास्तव में मुझ पर भरोसा :-)) के रूप में छोटे (अच्छी तरह से, नहीं मिलेगा)। तो एक बार फिर, कम पढ़ना। और लिखना भी।
इसलिए हम सामान्य प्रश्नों का उत्तर देने के लिए बहुत कम डेटा पढ़ते हैं, यह संभवतः समानांतर में पढ़ने और लिखने के लिए तेज़ है, और संपीड़न बहुत बेहतर काम करता है।
जब आपका इनपुट पक्ष बड़ा होता है, तो स्तंभकार महान होता है, और आपका आउटपुट फ़िल्टर किया गया सबसेट होता है: बड़े से लेकर छोटा तक महान होता है। जब इनपुट और आउटपुट एक ही हों, तो उतना फायदेमंद नहीं।
लेकिन हमारे मामले में, इम्पाला ने हमारे पुराने हाइव प्रश्नों को लिया, जो 5, 10, 20 या 30 मिनट में चला, और कुछ सेकंड या एक मिनट में समाप्त हो गया।
आशा है कि यह आपके प्रश्न के कम से कम भाग का उत्तर देने में मदद करता है!