开发者学堂课程【HBase入门教程:HBase代码_6】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/397/detail/5078
HBase代码_6
一、代码操作
把之前的表清空掉,从新创建;找到 createTb1在给它重新创建(右键 èRun Asè1 Junit Test 代码如下:)
代码:
public void createTbl() throws Exception {
if (hBaseAdmin. tableExists (TN)) {
hBaseAdmin. disableTable (TN) ;
hBaseAgmin. deleteTable (TN) ;}
创建表它会把之前的禁用掉,然后在删除掉。执行完成之后在插入一些数据,先看一下这个方法:(代码如下:)
代码:
/**
*随机生成时间
* @param year
年份
*@return
*/
public String getDate (String year) {
return year + String. format ("%02d%02d%02d%02d %02d",
new Object[]{r.nextInt(12)+1, r.nextInt(29) +1,
r.nextInt(60)
,r.nextInt(60), r.nextInt(60)});
}
先看一下这个方法,0到28+1,也就是1到29,这个是天数;12+1这个是月份;0到59这个是时分秒。
我们把数据插入进去,找到 insertDB(右键 èRun Asè1 Junit Test 代码如下:代码如下:)
代码:
@Test
public void insertDB() throws Exception {
List puts = new ArrayList () ;
for (int i =0Fi< 10:1++) {
String rowkey;
String ptioneNum = getPhoneNum("186") ;
…(下面代码省略)
让它自己插入进去。
下面的图片 routk,实际上是看不出来的,使用 HBase 来找一条数据来观察一下:
代码:
# Hbase shell
>scan
‘phone’
找一下那个月份下面有数据,随便拿一个手机号:19869973212790,这个手机号在一月份下面一定有数据。有一个问题,刚刚代码里面由于该 bug,刚刚是不是拿到时间,这个时间是在循环里面取的,一条循环对应了一个时间。(可以在下图观察)
先输出一下,把一月份的数据拿出,先拿到一个手机号:186997321127。(把下列加红的修改掉)
代码:
//186997321127 2016年二月份的通话账单
Scan scan = new Scan();
SimpleDateFormat sdf = new SimpleDateFormat ("yyyyMMddHHmmss") ;
String startRowkey = "18699732127" + (Long.MAX VALUE-sdf.parse("20160201000000").getTime());
scan. setStartRow (startRowkey. getBytes());
String stopRowkey = "18699732127" + (Long.MAX_ VALUE-sdf.parse("20160101000000").getTime());
scan. setStopRow (stopRowkey .getBytes()) ;
然后在进行输出。(找到 scanDB 右键 èRun Asè1 Junit Test 输出),观察下列输出的数据时间,是一月28、29、25的数据,在观察25号的数据,14、13是不是做了一个降序,这就按照我们的要求出来了。这种方式要注意了,我们做一个降序,我们本身在 hbase 里面存储的时候,它是按照升序来做的。要改变它的排序方式,就可以用最大值减去这个值,就可以做一个升序的排序了。
输出数据:
1- 20160129371521-17073565534
1- 20160128451917- 17046965986
0-20160128343157-17046819077
1-20160125142700-1 7083734845
1-20160125120850- 17017869843
另一种方法,在文档的 chapter 66.client request filters 这个下面。在66.1.1.filterlist 下面举了一个例子:
代码:
FilterList list = new FilterList(FilterList .Operator .MUST PASS _ONE);
SingleColumnValueFilter filterl = new SingleColunValueFilter(
Cf,
column,
CompareOp.EQUALI,
Bytes. toBytes("my value"));
list .add(filter1);
SingleColumnValueFilter filter2 = nem SingleColumnValueFilter(
Cf,
Column,
Compar eOp. EQUAL,
Bytes. toBytes("my other value")};
list. add(filter2);
scan. setFilter(list);
在 setFilter(list)里面可以加一个过滤器也可以加多个过滤器,在这个里面加了多个过滤器,前面首先创建了一个FilterList,在 FilterList 里面使用了两个 SingleColumnValueFilter 过滤器;每一次创建完成之后,都会 add 进去;在 FilterList .Operator.MUST PASS _ONE 是什么意呢?首先这个是一个多个 Filter,必须满足其中一个条件。看一下Filter 支持于那些:(代码如下:)
代码:
/**
* 查询某个手机号所有王叫type=0的通话单
*/
public void scanDB2() {
FilterList list = new FilterList(FilterList .Operator .MUST PASS _ONE/ MUST PASS _ALL);
PrefixFilter prefixFilter = new PrefixFilter ("18699732123".getBytes
())
1ist. addFilter (prefixFiiter) ;
SingleColumnValueFilter singleColumnValueFilter =
new SingleColumnValueFilter("cf1".getByte9()
,"type" .getByte5(),CompareOp.EQUAL; "0" getBytes());
list . addFilter (singleColumnValueFilte) ;
}
在上面代码里面,MUST PASS _ONE 表示满足其中之一就行,而 MUST PASS _ALL 都要满足。
SingleColumnValueFilter 这个主要是什么意思呢?在66.2 column value 这章里面就讲到了(下列例子:)
SingleColumValueFilter filter = new SingleCoLumnVaLUeFilter(
Cf,
Column,
CompareOp.EQUAL,
Bytes. toBytes("my value")};
scan.setFilter(filter);
创建了一个 SingleCoLumnVaLUeFilter,有这几个选项:
第一个、列图,
第二个、列名,
第三个、是操作干,必须要相等,后面加了一个值,是一个四节数组的值。在后面加了给 my value 是什么意思?就是你的过滤器,这一列它的值必须等于 my value
我们继续完善 scanDB2代码!