2012-06-29 16 views
18

मैं जैसे एक मेज को परिभाषित किया है:हाइव में बाहरी तालिका बनाते समय मैं निर्देशिका में विशिष्ट फ़ाइलों को स्थान इंगित कर सकता हूं?

create external table PageViews (Userid string, Page_View string) 
partitioned by (ds string) 
row format as delimited fields terminated by ',' 
stored as textfile location '/user/data'; 

मैं/उपयोगकर्ता/डाटा निर्देशिका में सभी फ़ाइलों को नहीं करना चाहती तालिका के भाग के रूप में इस्तेमाल किया जा करने के लिए। क्या मेरे लिए निम्नलिखित करना संभव है?

location 'user/data/*.csv' 

उत्तर

8

मुझे इस धागे में आया जब मुझे हल करने में एक ही समस्या थी। मैं एक कस्टम SerDe का उपयोग करके इसे हल करने में सक्षम था। मैंने फिर सेरडी गुणों को जोड़ा जो निर्देशित करता है कि RegEx किसी विशेष तालिका के लिए फ़ाइल नाम पैटर्न पर लागू करने के लिए क्या करता है।

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

> CREATE EXTERNAL TABLE PageViews (Userid string, Page_View string) 
> ROW FORMAT SERDE 'com.something.MySimpleSerDe' 
> WITH SERDEPROPERTIES ("input.regex" = "*.csv") 
> LOCATION '/user/data'; 
+0

opencsvserde के साथ काम नहीं करता – thebluephantom

6

नहीं, आप वर्तमान में ऐसा नहीं कर सकते हैं। हाइव टेबल (https://issues.apache.org/jira/browse/HIVE-951) के लिए शामिल फ़ाइलों के रेगेक्स चयन की अनुमति देने के लिए एक जेआईआरए टिकट खुला है।

अब आपके लिए सबसे अच्छी शर्त एक अलग निर्देशिका पर एक टेबल बनाना है और केवल उन फाइलों में कॉपी करना है जिन्हें आप क्वेरी करना चाहते हैं।

+1

मुझे लगता है कि यह समस्या अभी भी खुला है ... – Haimei

15

क्या किमीोसली ने कहा सच है। अभी तक, आप चुनिंदा रूप से कुछ फ़ाइलों को अपने हाइव टेबल का हिस्सा नहीं चुन सकते हैं। हालांकि, इसके चारों ओर जाने के 2 तरीके हैं।

विकल्प 1: आप सभी सीएसवी फाइलों को किसी अन्य एचडीएफएस निर्देशिका में ले जा सकते हैं और इसके ऊपर एक हाइव टेबल बना सकते हैं। यदि यह आपके लिए बेहतर काम करता है, तो आप अपनी वर्तमान निर्देशिका में एक उपनिर्देशिका (कहें, सीएसवी) बना सकते हैं जिसमें सभी सीएसवी फाइलें हों। फिर आप इस उपनिर्देशिका के शीर्ष पर एक हाइव टेबल बना सकते हैं। ध्यान रखें कि मूल निर्देशिका के शीर्ष पर बनाए गए किसी भी हाइव टेबल में उपनिर्देशिका से डेटा नहीं होगा।

विकल्प 2: आप INPUT__FILE__NAME नामक एक आभासी स्तंभ का उपयोग करने के आपके प्रश्नों बदल सकते हैं।

आपकी क्वेरी कुछ देखने की तरह होगा:

SELECT 
    * 
FROM 
    my_table 
WHERE 
    INPUT__FILE__NAME LIKE '%csv'; 

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

इस दृष्टिकोण का लाभ यह है कि यदि आप अपनी तालिका में कई फाइलें रखते हैं तो आप एक ही हाइव टेबल का उपयोग कर सकते हैं और आप कुछ प्रश्नों और सबसेट में उस तालिका (या इसके विभाजन) से सभी फाइलों से पूछताछ करने की क्षमता चाहते थे अन्य प्रश्नों में फाइलों का। आप इसे प्राप्त करने के लिए INPUT__FILE__NAME वर्चुअल कॉलम का उपयोग कर सकते हैं।एक उदाहरण के रूप: अगर आपके HDFS निर्देशिका /user/hive/warehouse/web_logs/ में एक विभाजन देखा की तरह:

CREATE EXTERNAL TABLE IF NOT EXISTS web_logs_table (col1 STRING) 
PARTITIONED BY (dt STRING) 
LOCATION '/user/hive/warehouse/web_logs'; 

उचित विभाजन जोड़ने के बाद, आप में सभी लॉग क्वेरी सकता है:

/user/hive/warehouse/web_logs/dt=2012-06-30/ 
    /user/hive/warehouse/web_logs/dt=2012-06-30/00.log 
    /user/hive/warehouse/web_logs/dt=2012-06-30/01.log 
    . 
    . 
    . 
    /user/hive/warehouse/web_logs/dt=2012-06-30/23.log 

मान लें कि आपका तालिका परिभाषा देखा की तरह करते हैं विभाजन की तरह एक क्वेरी का उपयोग:

SELECT 
    * 
FROM 
    web_logs_table w 
WHERE 
    dt='2012-06-30'; 

हालांकि, अगर आप केवल दिन के पहले घंटे के लिए, आप कर सकते थे से लॉग के बारे में परवाह क्वेरी की तरह एक क्वेरी का उपयोग कर पहले घंटे के लिए लॉग:

SELECT 
    * 
FROM 
    web_logs_table w 
WHERE 
    dt ='2012-06-30' 
    AND INPUT__FILE__NAME='00.log'; 

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

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

2 विकल्पों के बीच निर्णय लेना:

यह वास्तव में आपके उपयोग के मामले पर निर्भर करता है। यदि आप कभी भी फाइलों की परवाह नहीं करेंगे, तो आप विकल्प 2 का उपयोग करके हाइव टेबल से बाहर निकलने का प्रयास कर रहे हैं, शायद एक ओवरकिल है और आपको निर्देशिका संरचना को ठीक करना चाहिए और निर्देशिका के शीर्ष पर एक हाइव टेबल बनाना चाहिए जिसमें आप परवाह है ।

यदि आप जिन फ़ाइलों को वर्तमान में छोड़ रहे हैं, वे अन्य फाइलों के समान प्रारूप का पालन करते हैं (इसलिए वे सभी एक ही हाइव टेबल का हिस्सा हो सकते हैं) और आप स्वयं को एक क्वेरी लिख सकते हैं जो निर्देशिका में सभी डेटा का विश्लेषण करेगा, फिर विकल्प 2 के साथ जाएं।

+0

धन्यवाद मार्क। मैं वर्तमान में उत्पादन में विकल्प 1 कर रहा हूं, लेकिन मैं अपने देव पर्यावरण में विकल्प 2 का परीक्षण करूंगा ताकि मैं इसे अपने टूलबल्ट –

+0

में 'INPUT__FILE__NAME' के लिए जोड़ सकूं। अभी भी सभी डेटा स्कैन करने की आवश्यकता है लेकिन किसी भी तरह से कामयाब हो सकता है ... विशेष रूप से जब आप – msciwoj

+0

विभाजन नहीं करना चाहते/नहीं/विकल्प नहीं कर सकते हैं विकल्प # 2 अभी भी एक समस्या है जब आपके पास INSERT ओवरराइट है, तो यह सभी फ़ाइलों को हटा देगा, भले ही आप बस इसमें से एक को ओवरराइट करना चाहते हैं। – Dhiraj