क्या किमीोसली ने कहा सच है। अभी तक, आप चुनिंदा रूप से कुछ फ़ाइलों को अपने हाइव टेबल का हिस्सा नहीं चुन सकते हैं। हालांकि, इसके चारों ओर जाने के 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 के साथ जाएं।
opencsvserde के साथ काम नहीं करता – thebluephantom