在HBase中将bytes []转换为字符串

时间:2012-09-12 16:38:47

标签: java hadoop byte hbase

我将以下行存储在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);

3 个答案:

答案 0 :(得分:7)

字符串转换的标准HBase方式是Bytes.toBytes(string)和Bytes.toString(bytes)。但Jon Skeet是正确的,因为您需要考虑如何将数据放入列中。如果您使用了Bytes.toBytes(int),则需要在转换为字符串之前将字节转换回整数。

答案 1 :(得分: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”。

答案 2 :(得分:2)

我们只使用new String(byte[]),其中byte []来自org.apache.hadoop.hbase.KeyValue.getValue(),以字符串形式从HBase列解析字节,它对我们的项目工作正常。 :) 对不起,如果我在问题中遗漏了什么。希望这会有所帮助。