2011-03-21 15 views
30

Hadoop में मानचित्र को कम करने के लिए प्रभावी ढंग से उपयोग करने के लिए, मुझे hadoop's sequence file format में संग्रहीत डेटा की आवश्यकता है। हालांकि, वर्तमान में डेटा केवल फ्लैट .txt प्रारूप में है। क्या कोई भी सुझाव दे सकता है कि मैं एक .txt फ़ाइल को अनुक्रम फ़ाइल में परिवर्तित कर सकता हूं?.txt फ़ाइल को हडोप के अनुक्रम फ़ाइल प्रारूप में कनवर्ट करने के लिए कैसे करें

उत्तर

31

तो जिस तरह से अधिक सरल जवाब सिर्फ एक "पहचान" नौकरी है जिसमें अनुक्रम फ़ाइल आउटपुट है।

जावा में इस तरह लग रहा है: अपने डेटा HDFS पर नहीं है

public static void main(String[] args) throws IOException, 
     InterruptedException, ClassNotFoundException { 

    Configuration conf = new Configuration(); 
    Job job = new Job(conf); 
    job.setJobName("Convert Text"); 
    job.setJarByClass(Mapper.class); 

    job.setMapperClass(Mapper.class); 
    job.setReducerClass(Reducer.class); 

    // increase if you need sorting or a special number of files 
    job.setNumReduceTasks(0); 

    job.setOutputKeyClass(LongWritable.class); 
    job.setOutputValueClass(Text.class); 

    job.setOutputFormatClass(SequenceFileOutputFormat.class); 
    job.setInputFormatClass(TextInputFormat.class); 

    TextInputFormat.addInputPath(job, new Path("/lol")); 
    SequenceFileOutputFormat.setOutputPath(job, new Path("/lolz")); 

    // submit and wait for completion 
    job.waitForCompletion(true); 
    } 
+1

तो, अगर मैं 100 .txt फ़ाइलें है यह मुझे 100 .seq फ़ाइलों दे देंगे, है ना? अगर मैं 1 बड़ा .seq फ़ाइल चाहता हूं तो क्या होगा? – dranxo

+10

मुझे अनुमान है: job.setNumReduceTasks (1); – dranxo

+0

@rcompton yes बिल्कुल –

6

यह इस बात पर निर्भर करता है कि TXT फ़ाइल का प्रारूप क्या है। क्या यह प्रति रिकॉर्ड एक पंक्ति है? यदि ऐसा है, तो आप बस TextInputFormat का उपयोग कर सकते हैं जो प्रत्येक पंक्ति के लिए एक रिकॉर्ड बनाता है। अपने मैपर में आप उस लाइन को पार्स कर सकते हैं और जिस भी तरीके से आप इसे चुन सकते हैं उसका उपयोग कर सकते हैं।

यदि यह प्रति रिकॉर्ड एक पंक्ति नहीं है, तो आपको अपना खुद का इनपुटफॉर्मेट कार्यान्वयन लिखना पड़ सकता है। अधिक जानकारी के लिए this tutorial पर एक नज़र डालें।

0

हैं, तो आप HDFS पर अपलोड करने की जरूरत है। दो विकल्प:

i) आपकी .txt फ़ाइल पर hdfs -put और एक बार जब आप इसे एचडीएफएस पर प्राप्त कर लेते हैं, तो आप इसे seq फ़ाइल में परिवर्तित कर सकते हैं।

ii) आप अपने एचडीएफएस क्लाइंट बॉक्स पर इनपुट फ़ाइल के रूप में टेक्स्ट फ़ाइल लेते हैं और अनुक्रम फ़ाइल एपीआई का उपयोग करके Sequence फ़ाइल एपीआई का उपयोग करके SeqFile में कनवर्ट करें। अनुक्रम और इसमें संलग्न (कुंजी, मान)।

यदि आपको कुंजी की परवाह नहीं है, तो आप लाइन संख्या को कुंजी के रूप में कुंजी और पूर्ण पाठ के रूप में बना सकते हैं।

+1

मुझे पहले विकल्प का उपयोग करने की आवश्यकता है। मैं ऐसा कैसे कर सकता हूं? – zohar

4

आप केवल एक इंटरमीडिएट टेबल बना सकते हैं, सीओवी सामग्री को सीधे लोड कर सकते हैं, फिर अनुक्रमफाइल (विभाजन, क्लस्टर, आदि ..) के रूप में दूसरी तालिका बनाएं और इंटरमीडिएट तालिका से चयन में डालें। तुम भी संपीड़न, जैसे के लिए विकल्प सेट कर सकते हैं,

set hive.exec.compress.output = true; 
set io.seqfile.compression.type = BLOCK; 
set mapred.output.compression.codec = org.apache.hadoop.io.compress.SnappyCodec; 

create table... stored as sequencefile; 

insert overwrite table ... select * from ...; 

एमआर ढांचा तो, आप के लिए heavylifting का ख्याल रखेंगे आप जावा कोड लिखने के लिए होने की परेशानी की बचत।

14
import java.io.IOException; 
import java.net.URI; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IOUtils; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.SequenceFile; 
import org.apache.hadoop.io.Text; 

//White, Tom (2012-05-10). Hadoop: The Definitive Guide (Kindle Locations 5375-5384). OReilly Media - A. Kindle Edition. 

public class SequenceFileWriteDemo { 

    private static final String[] DATA = { "One, two, buckle my shoe", "Three, four, shut the door", "Five, six, pick up sticks", "Seven, eight, lay them straight", "Nine, ten, a big fat hen" }; 

    public static void main(String[] args) throws IOException { 
     String uri = args[ 0]; 
     Configuration conf = new Configuration(); 
     FileSystem fs = FileSystem.get(URI.create(uri), conf); 
     Path path = new Path(uri); 
     IntWritable key = new IntWritable(); 
     Text value = new Text(); 
     SequenceFile.Writer writer = null; 
     try { 
      writer = SequenceFile.createWriter(fs, conf, path, key.getClass(), value.getClass()); 
      for (int i = 0; i < 100; i ++) { 
       key.set(100 - i); 
       value.set(DATA[ i % DATA.length]); 
       System.out.printf("[% s]\t% s\t% s\n", writer.getLength(), key, value); 
       writer.append(key, value); } 
     } finally 
     { IOUtils.closeStream(writer); 
     } 
    } 
} 
+0

अच्छा और सरल उदाहरण! – user249654

+0

उरी क्या है? –

0

अगर आप महावत स्थापित किया है - यह कुछ का आह्वान किया है: seqdirectory - जो यह कर सकते हैं

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

  • कोई संबंधित समस्या नहीं^_^