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[])了 , where byte[] 来自于org.apache.hadoop.hbase.KeyValue.getValue()将 HBase 列中的字节解析为字符串,它在我们的项目中运行良好。:) 抱歉,如果我错过了问题中的某些内容。希望这可以帮助。

于 2012-09-12T17:17:07.593 回答
2

首先,我会避免String.getBytes()在不指定编码的情况下使用。代码实际期望什么编码?"DIE".getBytes()当您调用and时明确指定它"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 回答