代码如下:
public static class CountMapper extends TableMapper<ImmutableBytesWritable ,Put>
{
public void map(ImmutableBytesWritable key,Result value,Context context){
byte[] b=key.get();
String test="";
System.out.println("key开始:");
for(int i=0;i<b.length;i++)
{test=Byte.toString(b[i]);System.out.println(test+"");}
System.out.println("key="+key.toString()+":::::value="+value.toString());
}
}
Hbase 的ImmutableBytesWritable类型,如果直接Systemout是一个类似与16进制的byte[];
直接System.out.println("key="+key+":::::value="+value.toString());的表结果如下:
key=42 79 65:::::value=keyvalues={Bye/content:count/1487064847469/Put/vlen=1/seqid=0}
key=47 6f 6f 64 62 79 65:::::value=keyvalues={Goodbye/content:count/1487064847469/Put/vlen=1/seqid=0}
key=48 61 64 6f 6f 70 65:::::value=keyvalues={Hadoope/content:count/1487064847469/Put/vlen=1/seqid=0}
key=48 65 6c 6c 6f 70 65:::::value=keyvalues={Hellope/content:count/1487064847469/Put/vlen=1/seqid=0}
key=57 6f 72 6c 64 70 65:::::value=keyvalues={Worldpe/content:count/1487064847469/Put/vlen=1/seqid=0}
使用上面代码后表结果如下:
key开始:
66
121
101
key=42 79 65:::::value=keyvalues={Bye/content:count/1487064847469/Put/vlen=1/seqid=0}
key开始:
71
111
111
100
98
121
101
key=47 6f 6f 64 62 79 65:::::value=keyvalues={Goodbye/content:count/1487064847469/Put/vlen=1/seqid=0}
key开始:
72
97
100
111
111
112
101
key=48 61 64 6f 6f 70 65:::::value=keyvalues={Hadoope/content:count/1487064847469/Put/vlen=1/seqid=0}
key开始:
72
101
108
108
111
112
101
key=48 65 6c 6c 6f 70 65:::::value=keyvalues={Hellope/content:count/1487064847469/Put/vlen=1/seqid=0}
key开始:
87
111
114
108
100
112
101
key=57 6f 72 6c 64 70 65:::::value=keyvalues={Worldpe/content:count/1487064847469/Put/vlen=1/seqid=0}
可以看出,如57 6f 72 6c 64 70 65就是16进制的字符,代码改为
public void map(ImmutableBytesWritable key,Result value,Context context){
String test="";
System.out.println("key开始:");
String[] x=key.toString().split(" ");
for(int i=0;i<x.length;i++){x[i]=toStringHex(x[i]);test=test+""+x[i];}
System.out.println("key="+test+":::::value="+value.toString());
}
public static String toStringHex(String s)
{
byte[] baKeyword = new byte[s.length()/2];
for(int i = 0; i < baKeyword.length; i++)
{
try
{
baKeyword[i] = (byte)(0xff & Integer.parseInt(s.substring(i*2, i*2+2),16));
}
catch(Exception e)
{
e.printStackTrace();
}
}
try
{
s = new String(baKeyword, "utf-8");//UTF-16le:Not
}
catch (Exception e1)
{
e1.printStackTrace();
}
return s;
}
输出为:
key开始:
key=Bye:::::value=keyvalues={Bye/content:count/1487064847469/Put/vlen=1/seqid=0}
key开始:
key=Goodbye:::::value=keyvalues={Goodbye/content:count/1487064847469/Put/vlen=1/seqid=0}
key开始:
key=Hadoope:::::value=keyvalues={Hadoope/content:count/1487064847469/Put/vlen=1/seqid=0}
key开始:
key=Hellope:::::value=keyvalues={Hellope/content:count/1487064847469/Put/vlen=1/seqid=0}
key开始:
key=Worldpe:::::value=keyvalues={Worldpe/content:count/1487064847469/Put/vlen=1/seqid=0}
显然上面方法极其愚蠢,聪明的hbase书写者肯定考虑过这个问题,
于是问了大神,大神表示这么写就行了:
String abc=Bytes.toString(key.get());
人与人的差距