2013-05-23 8 views
12

के भीतर कॉलम के रूप में इनपुट फ़ाइल नाम कैसे प्राप्त करें मेरे पास कुछ निर्देशिका में मैप किए गए बाहरी टेबल हैं। इस निर्देशिका में कई फ़ाइलें शामिल हैं।हाइव क्वेरी

मैं की तरह खोजने के फ़ाइल नाम क्वेरी, जहां एक उपयोगकर्ता "abc"

select file_name , usr from usrs_tables where usr = "abc" 

लेकिन निश्चित रूप से डेटा फ़ाइल नाम के अंदर शामिल नहीं करता है चलाना चाहते हैं।

MapReduce में मैं द्वारा

FileSplit fileSplit = (FileSplit)context.getInputSplit(); 
String filename = fileSplit.getPath().getName(); 
System.out.println("File name "+filename); 
System.out.println("Directory and File name"+fileSplit.getPath().toString()); 

मैं हाइव में कर सकते हैं यह कैसे कर सकते हैं?

उत्तर

29

हाँ, आप फ़ाइल रिकॉर्ड INPUT__FILE__NAME नामित आभासी स्तंभ का उपयोग में पाया गया था, उदाहरण के लिए प्राप्त कर सकते हैं:

select INPUT__FILE__NAME, id, name from users where ...; 

पैदावार कुछ की तरह:

hdfs://localhost.localdomain:8020/user/hive/warehouse/users/users1.txt 2 user2 
hdfs://localhost.localdomain:8020/user/hive/warehouse/users/users2.txt 42 john.doe 

यदि आवश्यक हो, प्रदान की का उपयोग यूरी से होस्ट और निर्देशिका को ट्रिम करने के लिए string functions। छत्ता में आभासी स्तंभों पर https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VirtualColumns

+0

भव्य, बहुत बहुत धन्यवाद! – Julias

+0

बहुत बहुत धन्यवाद! यह बहुत ही उपयोगी है! विशेष रूप से, अगर हम बाह्य हाइव टेबल के रूप में बनाई गई बड़ी संख्या में लॉग फ़ाइलों से कुछ खोजते हैं, तो हमें आगे की जानकारी प्राप्त करने के लिए मिलान करने वाले फ़ाइल नामों को जानना होगा। – Sakthivel

+1

@jkovacs प्रेस्टो में INPUT__FILE__NAME के ​​बराबर है? –

3

हर तालिका हाइव में दो आभासी कॉलम शामिल हैं। वे हैं

  1. INPUT__FILE__NAME
  2. BLOCK__OFFSET__INSIDE__FILE

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

क्वेरी

select INPUT__FILE__NAME, name from customer_data; 

यह हमारे फ़ाइल नाम प्रत्येक रिकॉर्ड करने के लिए इसी दे देंगे। यदि आप एक हाइव टेबल से संबंधित फ़ाइल नाम प्राप्त करना चाहते हैं, तो नीचे दी गई क्वेरी आपकी मदद करेगी।

select distinct(INPUT__FILE__NAME) from customer_data;