在对HBase数据库的查询中,用到了SingleColumnValueFilter用于实现对于时间列中某一段时间记录的过滤,并且使用scan.addColumn获取结果中的某一列,
具体使用如下:
Scan scan = new Scan();
List<Filter> filters = new ArrayList<Filter>();
String stime = “2012-12-16 00:00:00”;
String etime= “2012-12-16 00:00:10”;
Filter filter1 = new SingleColumnValueFilter(cfs[0].getNameAsString().getBytes(),
"rTime".getBytes(), CompareOp.GREATER_OR_EQUAL,Bytes.toBytes(stime));
filters.add(filter1);
Filter filter2 = new SingleColumnValueFilter(cfs[0].getNameAsString().getBytes(),
"rTime".getBytes(), CompareOp.LESS_OR_EQUAL,Bytes.toBytes(etime));
filters.add(filter2);
scan.setFilter(filterList1);
scan.addColumn(cfs[0].getNameAsString().getBytes(), "CARNO".getBytes());
ResultScanner rs = table.getScanner(scan);
但是在程序运行中发现,SingleColumnValueFilter设置的时间区间不起作用,返回的是全部的CARNO。但是在加入“scan.addColumn(cfs[0].getNameAsString().getBytes(), "rTime".getBytes());”后,查询结果正确。由此可见如果scan.addColumn中的列不包括在SingleColumnValueFilter中设置的列时,SingleColumnValueFilter是不起作用的。但是不明白这是为神马。。。。。
此外在测试过程中还发现,对于sql语句
select monitor,carno from monitor where recordtime >=to_date ('2012-12-16 00:59:52','yyyy-mm-dd hh24:mi:ss') and recordtime <=to_date('2012-12-16 00:59:52','yyyy-mm-dd hh24:mi:ss') and carno='京P5SQ27';当条件中有carno='京P5SQ27'这种条件时,在select后面跟的列里面必须含有条件中对应的列,查询出来的结果才正确。