开发者学堂课程【HBase入门教程:HBase Protobuf_4 】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/397/detail/5092
HBase Protobuf_4
一、代码
/**
* 十个手机号 一天100条通话记录
* @throws Exception
*/
public void insertDB2()throws Exception{
for(int i=0;i<10;i++){
String rowkey;
String phoneNum=getPhoneNum("186");
rowkey=phoneNum+"_"+(Long.MAX_VALUE-Long.parseLong("20161110"));
// 一天的通话记录
Phone.pday.Builder pday=Phone.pday.newBuilder();
for(int j=0;j<100;j++){
String phoneDate=getDate2("20161110");
// 一条通话记录
Phone.pdetail.Builder detail=phone.pdetail.newBuilder();
detail.setPnum(getPhoneNum("177"));
detail.setTime(phoneDate);
detail.setType((r.nextInt(2)+""));
pday.addPlist(detail);
}
Put put=new Put(rowkey.getBytes());
}
put.add("cf1".getBytes(),"pday".getBytes(),pday.build().toByteArray());
hTable.put(put);
}
}
执行会有多少条数据
直接 scan ‘phone’
这样数据就很大了,把数据全部封装起来了。10个手机号,下边还有一层嵌套循环,对应的都是这一天,10个手机号1天都有100个通话记录,都封装到了 detall 里,封装完之后再插入到 getbtes 里
/*
* 拿到18696026061手机号 这一天的所有通话记录
* rowkey: 18696026061_9223372036834614697
* @throws Exception
*/
@Test
public void getPhoneData() throws Exception {
//手机号_时间戳
String rowkey = "18696026061_ 9223372036834614697";
Get get = new Get(rowkey.getBytes());
get.addColumn("cf1".getBytes(),"pday".getBytes());
Result rs = hTable.get(get);
Cell cell = rs.getColumnLatestCell("cf1".getBytes(),"pday".getBytes());
Phone.pday pday = Phone.pday.parseFrom(CellUtil.cloneValue(cell));
for(Phone.pdetail detail : pday.getPlistList()){
System.out.println(detail.getPnum()+"-"+detail.getTime()+"-"+detail.getType());
}
}
Get 拿到之后,是一个字节数组,最终把这个字节数组转成封装好的这个对象,先循环那个集合,在集合里的元素再通过 get 方法对应的属性都拿出来。用 protobuf 处理完之后,对于开发来说操作变得更加方便,出发点是为了优化、提高 HBase 的存储空间。