webentwicklung-frage-antwort-db.com.de

Wie konvertiert man eine .txt-Datei in das Sequenzdateiformat von Hadoop?

Um Map-Reduction-Jobs effektiv in Hadoop nutzen zu können, brauche ich Daten, die im hadoop-Sequenzdateiformat gespeichert werden. Derzeit sind die Daten jedoch nur im flachen TXT-Format. Kann jemand eine Möglichkeit vorschlagen, eine TXT-Datei in eine Sequenzdatei zu konvertieren?

30
Abhishek Pathak

Die einfachste Antwort ist also nur ein "Identitätsjob", der eine SequenceFile-Ausgabe hat.

Sieht in Java so aus:

    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);
   }
32
Thomas Jungblut
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); 
        } 
    } 
}
16

Es hängt davon ab, wie das Format der Datei TXT ist. Ist es eine Zeile pro Datensatz? In diesem Fall können Sie einfach TextInputFormat verwenden, das für jede Zeile einen Datensatz erstellt. In Ihrem Mapper können Sie diese Zeile parsen und sie auf beliebige Weise verwenden.

Wenn es sich nicht um eine Zeile pro Datensatz handelt, müssen Sie möglicherweise Ihre eigene InputFormat-Implementierung schreiben. Werfen Sie einen Blick auf dieses Tutorial für weitere Informationen.

7
bajafresh4life

Sie können auch einfach eine Zwischentabelle erstellen, LOAD DATA den csv-Inhalt direkt in die Tabelle laden und dann eine zweite Tabelle als Sequenzdatei (partitioniert, gruppiert usw.) erstellen und in select aus der Zwischentabelle einfügen. Sie können auch Optionen für die Komprimierung festlegen, z.

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 ...;

Das MR-Framework kümmert sich dann um die Schwerlastarbeit für Sie und erspart Ihnen die Mühe, Java-Code schreiben zu müssen.

4
Mario

Seien Sie vorsichtig mit dem Formatbezeichner :.

Zum Beispiel (beachten Sie den Abstand zwischen % und s). System.out.printf("[% s]\t% s\t% s\n", writer.getLength(), key, value); gibt uns Java.util.FormatFlagsConversionMismatchException: Conversion = s, Flags =

Stattdessen sollten wir verwenden:

System.out.printf("[%s]\t%s\t%s\n", writer.getLength(), key, value); 
1
Pramod Kumar

wenn Sie Mahout installiert haben, heißt es: seqdirectory

0
Sumit Pal

Wenn sich Ihre Daten nicht auf HDFS befinden, müssen Sie sie auf HDFS hochladen. Zwei Optionen:

i) hdfs -put in Ihrer .txt-Datei und sobald Sie sie auf HDFS erhalten, können Sie sie in eine seq-Datei konvertieren.

ii) Sie nehmen eine Textdatei als Eingabe in Ihre HDFS-Client-Box und konvertieren diese mithilfe von Sequence File-APIs in SeqFile, indem Sie einen SequenceFile.Writer erstellen und (key, values) anhängen.

Wenn Sie sich nicht für den Schlüssel interessieren, können Sie die Zeilennummer und den vollständigen Text als Wert festlegen.

0
user656189