2013-03-07 4 views
10

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

क्या मैं अपने सभी टेक्स्ट डेटा को दो बार संग्रहीत करने से बच सकता हूं?

संपादित करें: मैं इसे निम्न आदेश के माध्यम से लोड

LOAD DATA INPATH '/user/logs/mylogfile' INTO TABLE `sandbox.test` PARTITION (day='20130221') 

फिर, मैं में ठीक उसी फ़ाइल पा सकते हैं:

/user/hive/warehouse/sandbox.db/test/day=20130220 

मैं इसे कॉपी किया गया था ग्रहण किया।

+0

आप कैसे कहते हैं, इसकी प्रतिलिपि बनाई गई है? आप उन्हें हाइव टेबल में कैसे लोड करते हैं? –

+0

मैं इसे 'लोड डेटा INPATH' xxx 'INTO तालिका yyy' के माध्यम से लोड करता हूं (पोस्ट संपादित देखें) तो मुझे फ़ाइल '/ user/hive/warehouse' में मिलती है। मैं सोच रहा हूं कि क्या यह वहां जा सकता है (मुझे लगता है कि मुझे अपनी निर्देशिका में विभाजन संरचना को लागू करना होगा लेकिन यह ठीक है) –

+0

यह एचडीएफएस में कैसे संग्रहीत किया गया था? –

उत्तर

14

उपयोग एक बाहरी तालिका:

CREATE EXTERNAL TABLE sandbox.test(id BIGINT, name STRING) ROW FORMAT 
       DELIMITED FIELDS TERMINATED BY ',' 
       LINES TERMINATED BY '\n' 
       STORED AS TEXTFILE 
       LOCATION '/user/logs/'; 

आप एक बाहरी तालिका के साथ विभाजन उपयोग करना चाहते हैं, आप विभाजन निर्देशिका के प्रबंधन के लिए जिम्मेदार होगा। निर्दिष्ट स्थान एक hdfs निर्देशिका होना चाहिए ..

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

+0

बिल्कुल वही जो मैं खोज रहा था! धन्यवाद –

3

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

LOAD DATA LOCAL INPATH '/your/local/filesystem/file.csv' INTO TABLE `sandbox.test` PARTITION (day='20130221') 

सूचना LOCAL

+0

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

+1

। हां, यदि आप सीधे HIVE गोदाम में फ़ाइल डालते हैं, तो तिथि HIVE में उपलब्ध होगी, कृपया तालिका की परिभाषा से फ़ोल्डर संरचना को फिट करना याद रखें (http://stackoverflow.com/questions/15077046/using-multiple-levels-of- विभाजन-इन-हाइव/15102064 # 15102064) – www

0

आप डेटा डुप्लिकेशन से बचने के लिए तालिका विभाजन कथन का उपयोग कर सकते हैं।

create External table if not exists TestTable (testcol string) PARTITIONED BY (year INT,month INT,day INT) row format delimited fields terminated by ','; 

ALTER table TestTable partition (year='2014',month='2',day='17') location 'hdfs://localhost:8020/data/2014/2/17/'; 
0

हाइव (वास्तविक क्लस्टर मोड में चलने पर कम से कम) स्थानीय फाइल सिस्टम में बाहरी फ़ाइलों का संदर्भ नहीं दे सकता है। हाइव टेबल निर्माण या लोड ऑपरेशन के दौरान फ़ाइलों को स्वचालित रूप से आयात कर सकता है। इसका कारण यह हो सकता है कि हाइव डेटा निकालने के लिए आंतरिक रूप से MapReduce नौकरियां चलाता है। MapReduce एचडीएफएस से पढ़ता है और साथ ही एचडीएफएस को लिखता है और यहां तक ​​कि वितरित मोड में भी चलता है। इसलिए यदि फ़ाइल स्थानीय फाइल सिस्टम में संग्रहीत है, तो इसका उपयोग वितरित बुनियादी ढांचे द्वारा नहीं किया जा सकता है।

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