hbase-map(ImmutableBytesWritable key,Result value,Context context)数据解析
2017-02-17 15:38
357 查看
代码如下:
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());
人与人的差距
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());
人与人的差距
相关文章推荐
- InputSplit—>RecordReder—>map(key,value,context)的过程解析
- Cassandra 的数据存储结构——本质是SortedMap<RowKey, SortedMap<ColumnKey, ColumnValue>>
- Java解析复杂嵌套JSON数据格式代码,提取出来所有的key和value。亲测代码可用
- 使用map来进行票数统计工作,循环输入多个人名,作为key存储到map中,对应的value就是该人获得的票数(即重复输入的次数),当重复输入时,需要对相应的数据进行修改。最红输quit结束循环,打印
- js解析json,js转换json成map,获取map的key,value,jsonmap
- 按层级/条件解析Json,获取相应的key或value中的相关数据
- 浅谈JsonObject中的key-value数据解析排序问题
- js解析json,js转换json成map,获取map的key,value
- C++之map插入数据相同的key不能覆盖value解决办法
- Map排序,获取map的第一值,根据value取key等操作(数据预处理)
- MyBatis根据Map中key作为字段名,value作为字段值修改数据
- JsonObject中的key-value数据解析排序问题
- 从标准输入中读取两个字符串 name:表示姓名,hobby:爱好;name作为key;hobby作为Value存入Map 然后根据姓名取得Value并打印,再根据name值删除map中的数据再打印ma
- 递归解析任意层的Json数据,获取所有的key和value,Java实现
- Json 解析数据 只有key,没有value的解析
- rapidjson 实现未知json数据解析,拿到每一个key和value
- 遍历取出Map集合key-value数据的4种方法
- Cassandra key说明——Cassandra 整体数据可以理解成一个巨大的嵌套的Map Map<RowKey, SortedMap<ColumnKey, ColumnValue>>
- java类型转化之Hbase ImmutableBytesWritable类型转String
- 获取map中根据key进行排序的value数据