2013-05-06 7 views
11

मुझे आश्चर्य है कि क्या वास्तव में एक बाइनरी हाइव प्रारूप में सीएसवी डेटा लोड करने का कोई तरीका है - यानी एक रिलेशनल डेटाबेस में डेटा लोडिंग के समान ही करना होगा: इनपुट को कनवर्ट करना और इसे बाइनरी प्रारूप में संग्रहीत करना हाइव के मामले में एक और बाइनरी फ़ाइल)। हाइव संदर्भ कहता है कि load data inpath कमांड "कोई परिवर्तन नहीं करता" इसलिए मुझे संदेह है कि प्रकार परिवर्तित नहीं होते हैं, उदाहरण के लिए, स्ट्रिंग से पूर्णांक तक। मैं ओसीआर और आरसीफ़ाइल प्रारूपों के बारे में पढ़ रहा था लेकिन मुझे यह पता लगाने में सक्षम नहीं था कि, उदाहरण के लिए, सीएसवी से स्ट्रिंग मानों को मशीन पूर्णांक मानों में परिवर्तित किया गया है और एचडीएफएस में संग्रहीत किया गया है। क्या यह मामला है? हाइव में सीएसवी फाइलों के बाइनरी प्रस्तुतियों को बनाने के लिए अन्य संभावनाएं क्या हैं?क्या सीएसवी डेटा को "बाइनरी" हाइव प्रारूप में लोड करने का कोई तरीका है?

संबंधित नोट पर: मुझे संदेह है कि हाइव स्ट्रिंग मानों को क्वेरी प्रसंस्करण के दौरान मशीन प्रस्तुतियों में परिवर्तित करता है और नहीं, उदाहरण के लिए, स्ट्रिंग मानों की तुलना करना - क्या यह धारणा सही है?

उत्तर

21

डिफॉल्ट रूप से, हाइव सिर्फ सादे पाठ फ़ाइलों के रूप में फ़ाइलों को संग्रहीत करता है और रिकॉर्ड को सादा पाठ के रूप में स्टोर करता है, सभी असम्पीडित। यह एक क्षेत्र विभाजक के लिए 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 

ऊपर के उदाहरण दर्शाता है कि कैसे आप सभी विकल्प आप के लिए उपलब्ध का लाभ ले सकता है, लेकिन एक डिफ़ॉल्ट, उचित उपयोग के मामले के रूप में नहीं लगता। विभिन्न फ़ाइल स्वरूपों/सेरडीज़/संपीड़न कोडेक्स पर पढ़ें और अपने दृष्टिकोण पर व्यवस्थित करने के लिए कुछ प्रदर्शन परीक्षण करें।

+0

विस्तृत विवरण के लिए धन्यवाद! – muehlbau

+0

महान जवाब! +1 – davek

संबंधित मुद्दे