web-dev-qa-db-ja.com

.txtファイルをHadoopのシーケンスファイル形式に変換する方法

Hadoop でmap-reduceジョブを効果的に使用するには、データを hadoopのシーケンスファイル形式 に保存する必要があります。ただし、現在、データはフラットな.txt形式のみです。txtファイルをシーケンスファイルに変換する方法を提案できる人はいますか?

31
Abhishek Pathak

そのため、最も簡単な答えは、SequenceFile出力を持つ「アイデンティティ」ジョブです。

Javaでは次のようになります。

    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

TXTファイルの形式に依存します。レコードごとに1行ですか?その場合、各行に1レコードを作成するTextInputFormatを使用できます。マッパーで解析できます。その行を使用して、選択した方法で使用します。

レコードごとに1行ではない場合は、独自のInputFormat実装を記述する必要があります。詳しくは このチュートリアル をご覧ください。

7
bajafresh4life

中間テーブルを作成し、csvの内容を直接LOAD DATAしてから、2番目のテーブルをシーケンスファイル(パーティション、クラスター化など)として作成し、中間テーブルからselectに挿入することもできます。圧縮のオプションを設定することもできます。たとえば、

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

その後、MRフレームワークが重量物の処理を行い、Javaコードを記述する必要がなくなります。

4
Mario

書式指定子_:_に注意してください。

たとえば(_%_とsの間のスペースに注意してください)、System.out.printf("[% s]\t% s\t% s\n", writer.getLength(), key, value);は_Java.util.FormatFlagsConversionMismatchException: Conversion = s, Flags =_を提供します

代わりに、次を使用する必要があります。

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

mahoutをインストールしている場合-seqdirectoryと呼ばれるものがあります。

0
Sumit Pal

データがHDFSにない場合は、HDFSにアップロードする必要があります。 2つのオプション:

i).txtファイルにhdfs -putし、HDFSで取得したら、seqファイルに変換できます。

ii)HDFSクライアントボックスの入力としてテキストファイルを取得し、SequenceFile.Writerを作成して(key、values)を追加することにより、Sequence File APIを使用してSeqFileに変換します。

キーを気にしない場合、uはキーとして行番号を作成し、値としてテキストを完成させることができます。

0
user656189