我将以下行存储在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);
答案 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列解析字节,它对我们的项目工作正常。 :)
对不起,如果我在问题中遗漏了什么。希望这会有所帮助。