0

次のコードを使用して、HadoopSequenceFileの一部をプレーンテキストに変換しようとしています。

    Configuration config = new Configuration();
    Path path = new Path( inputPath );
    SequenceFile.Reader reader = new SequenceFile.Reader(FileSystem.get(config), path, config);
    WritableComparable key = (WritableComparable) reader.getKeyClass().newInstance();
    Writable value = (Writable) reader.getValueClass().newInstance();

    File output = new File(outputPath);
    if(!output.exists()) output.createNewFile();

    FileOutputStream fos = new FileOutputStream(output);
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos, "utf-8"));

    int count = 0;

    try {
        while(reader.next(key,value) && count < 1000)
        {
            bw.write("Key::: " + key);
            bw.newLine();
            bw.write("Value::: " + value);
            bw.newLine();
            bw.newLine();
            count++;
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    reader.close();
    bw.close();

キーは適切に変換できます。ただし、値は16進数の16進数ストリームに変換されます。サンプルは次のとおりです。

Value::: 1f 8b 08 00 00 00 00 00 00 03 e5 bd f9 7b 13 47 d6 28 fc 73 e6 79 e6 7f e8 28 17 6c 5f bc 68 5f 6c e4 5c 96 64 26 33 c9 24 37 cb bc ef 3b 0c 9f 9f 56 77 cb ee 58 96 34 5a 20 8e e3 3f 46 56 c2 10 30 c4 8b e4 4d 5e b1 6c 4b f2 22 59 b2 65 63 48 08 04 42 12 c2 9e 00 21 cb f3 9d 53 d5 2d b5 64 4b 16 33

実際のストリームはこれよりはるかに長くなります。私が知っているのは、キーはHadoop Textフォーマットとして保存され、値はとして保存されるということHadoop BytesWritableです。値は中国語かもしれませんが、これについてはよくわかりません。

誰かが何が起こっているのか知っていますか?

4

1 に答える 1

1

値はとして保存されると言いますBytesWritable。これはJavaのバイト配列にマップされます。これを行うためにメソッドがオーバーロードされているbyte[]ため、これが正確に出力されます。toString()

また、バイトが中国語のテキストである可能性があることにも言及しました。それを出力したい場合は、バイトをにエンコードする必要がありますString。行を変更する必要があります

bw.write("Value::: " + value);

他のカップルに。

byte[] strBytes = ((BytesWritable) value).getBytes();
bw.write("Value::: " + new String(strBytes, Charset.forName("UTF-8")));

これは、中国語の文字列が「UTF-8」を使用してエンコードされていることを前提としています。正確なエンコーディングがわからない場合は、さまざまなエンコーディングを試して、何が機能するかを確認する必要があります。

于 2013-03-14T09:14:28.870 に答える