डिफॉल्ट रूप से, हाइव सिर्फ सादे पाठ फ़ाइलों के रूप में फ़ाइलों को संग्रहीत करता है और रिकॉर्ड को सादा पाठ के रूप में स्टोर करता है, सभी असम्पीडित। यह एक क्षेत्र विभाजक के लिए ASCII 0x1 का उपयोग करता है जो कुछ इनपुट के लिए अल्पविराम से अधिक सुविधाजनक है, लेकिन मुझे यकीन है कि आपने काम किया है कि हाइव को अल्पविराम से अलग मूल्यों के साथ काम करने के लिए कैसे प्राप्त किया जाए। यदि आप एक अलग फ़ाइल प्रारूप का उपयोग करने के लिए हाइव चाहते हैं, तो अलग-अलग क्रमबद्ध करें/deserialize, या डेटा को संपीड़ित करें जिसमें आपके पास खेलने के लिए कुछ अलग-अलग विकल्प हैं।
बॉक्स के बाहर, हाइव कई अलग-अलग फ़ाइल स्वरूपों का समर्थन करता है: TEXTFILE
, SEQUENCEFILE
, और RCFILE
। फ़ाइलों को पढ़ने, विभाजित करने और लिखे जाने के तरीके के बीच अंतर करना है। TEXTFILE
डिफ़ॉल्ट है और सामान्य टेक्स्ट फ़ाइलों पर काम करता है। SEQUENCEFILE
एक द्विआधारी कुंजी-मूल्य जोड़ी प्रारूप है जिसे आसानी से हडोप पारिस्थितिकी तंत्र के अन्य हिस्सों द्वारा उपभोग किया जाता है। और RCFILE
हाइव टेबल को सहेजने के लिए कॉलम उन्मुख तरीका है। इस फ़ाइल स्वरूपों के अतिरिक्त, आप स्वयं को लिख सकते हैं या अन्य लोगों को अलग-अलग ज़रूरतों को पूरा करने के लिए लिखे गए लोगों को ढूंढ सकते हैं।
फ़ाइल स्वरूप के अलावा आपके डेटा को सहेजने में प्रारूपित करने के अलावा, आप तय कर सकते हैं कि किसी तालिका में रिकॉर्ड को सेरियलाइज़ किया गया है और एक सेर्डे निर्दिष्ट करके deserialized किया जाना चाहिए। हाइव 0.9.1 और ऊपर AvroSerDe
के साथ पैक किया जाता है, और एवरो बाइनरी प्रारूप में डेटा सहेजता है (इसमें एक स्कीमा भी है जो कुछ जटिलताओं को पेश करती है)। "हाइव बाइनरी सेर्डे" के लिए Google खोज ने LazyBinarySerde
का खुलासा किया जो बाइनरी प्रारूप में सहेजने का एक अधिक सरल तरीका है। और यदि आपको फिट करने के लिए कुछ भी नहीं मिल रहा है, तो आप हमेशा अपना स्वयं का सर्डी लिख सकते हैं।
मुझे लगता है कि आपका प्रश्न हाइव टेबल को छोटे और/या अधिक प्रदर्शन करने के तरीके के बड़े संदर्भ में फिट बैठता है। इस अंत तक आप ऊपर वर्णित सब कुछ के ऊपर संपीड़न लागू कर सकते हैं। पूरा करने के लिए इस बस हाइव बता यह उत्पादन है सेक और यह बताता है कि किस निम्न कमांड का प्रयोग संपीड़ित करने के लिए कोडेक के:
hive> set hive.exec.compress.output=true;
hive> set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec
आप अपने config फ़ाइलों में बदल सकते हैं अगर आप इन सत्र के बाहर जारी रहती सेटिंग चाहते (अन्य सहित यदि आप क्लस्टर साझा कर रहे हैं तो लोग हाइव और मैपरेडिस नौकरियां)। मैं SnappyCodec का उपयोग करता हूं क्योंकि यह बॉक्स के बाहर हाइव के साथ काम करता है, विभाजित है, और खर्च किए गए CPU समय के लिए अच्छा संपीड़न/डिकंप्रेशन देता है। आप तय कर सकते हैं कि एक अलग कोडेक आपकी आवश्यकताओं के लिए अधिक उपयुक्त है।
अब यदि आप अपना सभी डेटा CSV प्रारूप में हैं तो आप इन सभी विकल्पों को कैसे लागू करते हैं? सीएसवी फाइलों के शीर्ष पर एक टेबल बनाने का सबसे आसान तरीका है, फिर फ़ाइलफॉर्मेट और सेरडी के साथ एक और टेबल बनाएं, फिर सीएसवी समर्थित तालिका से डेटा को नई तालिका में डालें (सुनिश्चित करें कि आप अपने हाइव आउटपुट को संपीड़ित कर रहे हैं पसंद के अपने कोडेक के साथ)। हुड के तहत, हाइव डेटा को एक प्रारूप (सीएसवी) से पढ़ने और दूसरे को लिखने का ख्याल रखेगा (जो भी आपने तय किया है)। इसके बाद आपके पास डेटा का डुप्लिकेट होगा और यदि आप चाहें तो आप CSV फ़ाइलों को छोड़ सकते हैं।
CREATE EXTERNAL TABLE csv_table (id INT, name STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
LOCATION /user/muehlbau/yourData;
CREATE TABLE binary_table (id INT, name STRING)
ROW FORMAT SERDE org.apache.hadoop.hive.serde2.lazybinary.LazyBinarySerDe
STORED AS SEQUENCEFILE;
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec
INSERT OVERWRITE TABLE binary_table
SELECT * FROM csv_table
ऊपर के उदाहरण दर्शाता है कि कैसे आप सभी विकल्प आप के लिए उपलब्ध का लाभ ले सकता है, लेकिन एक डिफ़ॉल्ट, उचित उपयोग के मामले के रूप में नहीं लगता। विभिन्न फ़ाइल स्वरूपों/सेरडीज़/संपीड़न कोडेक्स पर पढ़ें और अपने दृष्टिकोण पर व्यवस्थित करने के लिए कुछ प्रदर्शन परीक्षण करें।
विस्तृत विवरण के लिए धन्यवाद! – muehlbau
महान जवाब! +1 – davek