2013-01-17 49 views
5

हाल ही में मैं लॉग फ़ाइलों को हाइव टेबल में लोड करना चाहता हूं, मुझे एक उपकरण चाहिए जो किसी निश्चित निर्देशिका से डेटा पढ़ सके और उन्हें स्वचालित रूप से हाइव में लोड कर सके। इस निर्देशिका में कई उपनिर्देशिकाएं शामिल हो सकती हैं, उदाहरण के लिए, कुछ निर्देशिका '/ log' है और उपनिर्देशिकाएं '/ log/20130115', '/ log/20130116', '/ log/201301017' हैं। क्या कुछ ईटीएल उपकरण हैं जो फ़ंक्शन को प्राप्त कर सकते हैं: एक बार जब कुछ डेटा किसी नए निर्देशिका में संग्रहीत किया जाता है, तो उपकरण स्वचालित रूप से इस डेटा का पता लगा सकता है और उन्हें हाइव टेबल में लोड कर सकता है। क्या ऐसे उपकरण हैं, क्या मुझे खुद ही स्क्रिप्ट लिखनी है?स्वचालित रूप से हाइव में डेटा लोड करने के लिए कैसे

उत्तर

4

आप आसानी से हाइव बाहरी टेबल का उपयोग करके और अपनी तालिका को दिन भर विभाजित कर सकते हैं। उदाहरण के लिए, इस तरह के रूप में अपने तालिका बनाने:

create external table mytable(...) 
partitioned by (day string) 
location '/user/hive/warehouse/mytable'; 

यह अनिवार्य रूप से metastore में एक खाली टेबल बना देगा और यह /user/hive/warehouse/mytable ओर इंगित करते हैं।

तो फिर तुम प्रारूप कुंजी के साथ इस निर्देशिका में अपने डेटा को लोड कर सकते हैं = मूल्य जहां कुंजी अपने विभाजन का नाम (यहाँ "दिन") और मूल्य है अपने विभाजन का मूल्य है। उदाहरण के लिए:

hadoop fs -put /log/20130115 /user/hive/warehouse/mytable/day=20130115 

अपने डेटा वहाँ भरी हुई है एक बार, यह HDFS निर्देशिका में है, लेकिन हाइव metastore अभी तक पता नहीं है कि यह तालिका के अंतर्गत आता है, तो आप इसे इस तरह से जोड़ सकते हैं:

alter table mytable add partition(day='20130115'); 

और आपको जाने के लिए अच्छा होना चाहिए, मेटास्टोर को आपके नए विभाजन के साथ अपडेट किया जाएगा, और अब आप इस विभाजन पर अपनी तालिका से पूछ सकते हैं।

यह स्क्रिप्ट को तुच्छ होना चाहिए, यदि आप एक क्रॉन जॉब दिन में एक बार चल रहा है इसी क्रम में इन कमांड करते हैं और date कमांड के साथ लोड करने के लिए विभाजन मिलेगा बना सकते हैं, उदाहरण के लिए लगातार इस आदेश कर:

hadoop fs -test /log/`date +%Y%m%d` 

और $? की जांच करना 0 के बराबर है, आपको बताएगा कि फ़ाइल यहां है और यदि यह है, तो आप इसे स्थानांतरित कर सकते हैं और ऊपर वर्णित विभाजन को जोड़ सकते हैं।

+0

बहुत बहुत शुक्रिया, वास्तव में, मैं एक और सवाल है, इस तरह से मैं लोड कर सकते हैं मेरे लॉग फ़ाइलों को हाइव टेबल में तिथि से विभाजित किया गया है, हालांकि, मेरे मालिक ने मुझे डेटा लोड करने के लिए एक दृष्टिकोण या उपकरण खोजने के लिए कहा, जिसका अर्थ है: मानते हैं कि '/ log' नामक एक निश्चित निर्देशिका है, हाइव इस निर्देशिका को हर समय पूछेगा , एक बार नया डेटा उत्पादित हो जाने पर, हो सकता है/लॉग/20130118,/लॉग/20130119, हाइव स्वचालित रूप से इस विभाजन को जोड़ देगा और लॉग फ़ाइल को लोड करेगा जैसे कि 20130118 या/20130119 तालिका के विभाजन में, मैं इसे कैसे प्राप्त कर सकता हूं, अपने क्षमा मांगें –

+0

जब आप कीवर्ड 'EXTERNAL' निर्दिष्ट करते हैं आपका डेटा कहीं भी कॉपी नहीं किया गया है और आपके द्वारा रखे गए स्थान पर रहता है। (जब आप 'बाहरी' निर्दिष्ट नहीं करते हैं, तो हाइव डेटा को अपने डिफ़ॉल्ट स्थान पर कॉपी करता है)। जहां तक ​​मुझे पता है, हर बार जब आप 'LOCATION' द्वारा निर्दिष्ट फ़ोल्डर में फ़ाइल जोड़ते हैं और आप बाद में अपनी तालिका से पूछते हैं, तो नया डेटा दिखाना चाहिए। यह कुछ समय हो गया है जब से मैंने हाइव के साथ खेला था, तो शायद @ चार्ल्स मेन्गू इसकी पुष्टि कर सकते हैं? – Pieterjan

+0

मुझे 100% यकीन नहीं है कि मैं समझता हूं कि आप क्या हासिल करना चाहते हैं, क्या आप अधिक जानकारी के साथ अपना प्रश्न संपादित कर सकते हैं?यदि आप बस बिना किसी विभाजन विभाजन के अपने टेबल में फ्लैट लोड फाइलों को लोड करना चाहते हैं, तो @Pieterjan सही है, आप फ़ाइलों को एचडीएफएस में अपनी तालिका की जड़ पर डाल सकते हैं और आपको टेबल को बदलने की जरूरत नहीं है, हाइव सीधे उठाएगा यह ऊपर –

1

आप हाइव द्वारा प्रदान किए गए लोड डेटा कमांड का उपयोग कर सकते हैं। यह वास्तव में आपके उपयोग के मामले से मेल खाता है। अपने स्थानीय फाइल सिस्टम में एक निर्देशिका निर्दिष्ट करें और इससे हाइव टेबल बनाएं।

उदाहरण उपयोग - डेटा लोड स्थानीय INPATH '/ घर/उपयोगकर्ता/कुछ-निर्देशिका' अधिलेखित तालिका तालिका में