2011-11-25 11 views
8

私はhadoop map-reduceジョブの出力であるシーケンシャルファイルを持っています。 このファイルのデータはキー値のペアで書き込まれ、値自体はマップです。 MAPオブジェクトとして値を読み取って、それをさらに処理できるようにします。プログラムのhadoopシーケンシャルファイルを読むには?

Configuration config = new Configuration(); 
    Path path = new Path("D:\\OSP\\sample_data\\data\\part-00000"); 
    SequenceFile.Reader reader = new SequenceFile.Reader(FileSystem.get(config), path, config); 
    WritableComparable key = (WritableComparable) reader.getKeyClass().newInstance(); 
    Writable value = (Writable) reader.getValueClass().newInstance(); 
    long position = reader.getPosition(); 

    while(reader.next(key,value)) 
    { 
      System.out.println("Key is: "+textKey +" value is: "+val+"\n"); 
    } 

出力:キーである:値[これはキーである]である:{ABC = 839177、XYZ = 548498、LMN = 2、PQR = 1}

は、ここでは、文字列として値を取得していしかし、私はマップのオブジェクトとしてそれをしたい。

+0

「val」はどこから来ますか?そして、Mapは 'Writable'ではありません。あなたのm/r仕事のクラスには何を使っていますか? –

+0

私はシーケンシャルファイルを持っていて、map reduce jobで実行していることを認識していません。次の情報が提供されています。 "それぞれのファイルをシーケンスファイルとして開く必要があります。シーケンスファイルのクラスは することができるように思うどの圧縮コーデックを使用すると、私は各キーと TypedBytesを使用してエンコードされていると思います。 – samarth

+0

次に、キーと値のクラスを取得する必要があります。そうでなければ、正しくデシリアライズしません。 –

答えて

6

SequenceFile#next(Writable, Writable)

while(reader.next(key,value)) 
{ 
     System.out.println("Key is: "+textKey +" value is: "+val+"\n"); 
} 

のためのAPIドキュメントをチェックしSequenceFileに値型を取得するために使用SequenceFile.Reader#getValueClassName

while(reader.next(key,value)) 
{ 
     System.out.println("Key is: "+key +" value is: "+value+"\n"); 
} 

に置き換える必要があります。 SequenceFileは、ファイルヘッダにキー/値型を持っています。

+0

ありがとうございました。値クラスは "TypedBytesWritable"です。このクラスからマップオブジェクトを取得できますか? – samarth

+1

[TypedBytesWritable#getValue](http://hadoop.apache.org/mapreduce/docs/current/api/org/apache/hadoop/typedbytes/TypedBytesWritable.html#getValue%28%29)はオブジェクトを取得する必要があります。 –

+0

それは私のために働いた..本当にありがとうPraveen。 – samarth

関連する問題