hadoopシーケンシャルファイルを読むには?

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

    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");
    }

プログラムの出力:Key is:[this is key]値は{abc = 839177、xyz = 548498、lmn = 2、pqr = 1}

ここでは文字列として値を取得していますが、マップのオブジェクトとして必要です。

8
@samarth圧縮された(gz/bz2/snappy)シーケンスファイルを読む方法。
追加された 著者 ParagFlume,
私はシーケンシャルファイルを持っていて、map reduce jobで何をしているのか分からない。私は以下の情報を提供している。 "それぞれのファイルはシーケンスファイルとして開く必要があります。ファイルクラスは、使用する圧縮コーデックを教えてくれるようです。そして、各キーと各値がTypedBytesを使ってエンコードされていると思います。
追加された 著者 samarth,
値クラスは "TypedBytesWritable"です。これからMapオブジェクトを取得できますか?
追加された 著者 samarth,
val はどこから来ますか?そしてMapは Writable ではありません。あなたのm/rジョブのクラスでは何を使用していますか?
追加された 著者 Thomas Jungblut,
次に、キーと値のクラスを取得する必要があります。そうでなければ、正しくデシリアライズしません。
追加された 著者 Thomas Jungblut,

1 答え

Check the API documentation for SequenceFile#next(Writable, Writable)

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

次のように置き換えるべきです

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

SequenceFile.Readerを使用してください。 #getValueClassName を使用して、SequenceFileの値の型を取得します。 SequenceFileは、ファイルヘッダにキー/値型を持っています。

6
追加された
ありがとう、値クラスは "TypedBytesWritable"ですが、このクラスからマップオブジェクトを取得できますか?
追加された 著者 samarth,
やあ、それは私のために働いた..本当にありがとうPraveen。
追加された 著者 samarth,
TypedBytesWritable# getValue はオブジェクトを取得する必要があります。
追加された 著者 Praveen Sripati,