3

以下の行を HBase テーブルに格納しています

 DIEp(^o^)q3    column=DIE:ID, timestamp=1346194191174, value=\x00\x00\x00\x01

値にアクセスして、本来あるべき文字列表現に変換しようとしていますが、このファイル (出力がリダイレクトされる場所) で1正しい文字列表現が得られません。cat

cat /hadoop/logs/userlogs/job_201209121654_0027/attempt_201209121654_0027_m_000000_0/stdout

こんなゴミが出てきた NUL NUL NUL SOH

以下は、私が使用しているコードフラグメントです。

byte[] result1 = value.getValue("DIE".getBytes(), "ID".getBytes());
String myresult = Bytes.toString(result1);
System.out.println(myresult);
4

3 に答える 3

8

文字列変換の標準的なHBaseの方法は、Bytes.toBytes(string)およびBytes.toString(bytes)です。しかし、Jon Skeetは、最初にデータを列に配置する方法を検討する必要があるという点で正しいです。Bytes.toBytes(int)を使用した場合は、文字列に変換する前に、バイトを整数に戻す必要があります。

于 2012-09-12T20:53:04.263 に答える
3

new String(byte[])byte[] は、HBase 列からのバイトを文字列として解析するために使用さorg.apache.hadoop.hbase.KeyValue.getValue()れ、プロジェクトでは正常に機能します。:) 申し訳ありませんが、質問で何かを逃した場合。お役に立てれば。

于 2012-09-12T17:17:07.593 に答える
2

まず、String.getBytes()エンコーディングを指定せずに使用することは避けます。コードが実際に期待するエンコーディングは何ですか? "DIE".getBytes()とを呼び出すときに明示的に指定します"ID".getBytes()

次に、最初に 4 バイトを整数に変換し、次にその整数を文字列に変換する必要があるようです例えば:

byte[] valueAsBytes = ...;
int valueAsInt = ((valueAsBytes[0] & 0xff) << 24) |
                 ((valueAsBytes[1] & 0xff) << 16) |
                 ((valueAsBytes[2] & 0xff) << 8) |
                 (valueAsBytes[3] & 0xff);
String valueAsString = String.valueof(valueAsInt);

Java API にビット操作を直接行うための何かがあるかもしれませんが、今のところ思いつきません。(ありますがDataInputStream、最初にバイト配列をラップする必要がByteArrayInputStreamあります。次に、エンディアンを確認する必要があります...)

あなたの現在のコードは、あなたが求めていることを正確に実行しています-確かに、プラットフォームのデフォルトのエンコーディングを使用しています. 基本的に「\u0000\u0000\u0000\u0001」です。

于 2012-09-12T16:46:44.507 に答える