问题:
最近在查一张Hbase表时,设定单列过滤器,取time列时间为某一天的数据:
filterList.addFilter(new SingleColumnValueFilter(Bytes.toBytes("cf"), Bytes.toBytes("time"), CompareFilter.CompareOp.GREATER_OR_EQUAL, new BinaryComparator(Bytes.toBytes(date1))))
filterList.addFilter(new SingleColumnValueFilter(Bytes.toBytes("cf"), Bytes.toBytes("time"), CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(date2))))
然后添加列:
scan.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("uuid"))
但是最后查出来的结果竟然是所有数据,为了搞清楚问题出在哪里,我们用测试表测试一下;
测试:
1.测试数据:
2.添加过滤器和列并输出
filterList.addFilter(new SingleColumnValueFilter(Bytes.toBytes("info"), Bytes.toBytes("age"), CompareFilter.CompareOp.GREATER_OR_EQUAL, new BinaryComparator(Bytes.toBytes("10"))))
filterList.addFilter(new SingleColumnValueFilter(Bytes.toBytes("info"), Bytes.toBytes("age"), CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("20"))))
scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"))
/**xxx**/
hbaseRdd.map(x=>{
val rowkey = Bytes.toString(x._2.getRow)
val age = Bytes.toString(x._2.getValue(Bytes.toBytes("info"), Bytes.toBytes("age")))
val name = Bytes.toString(x._2.getValue(Bytes.toBytes("info"), Bytes.toBytes("name")))
(rowkey,name,age)
})
3.查看结果
(1,a,null)
(2,a,null)
(3,b,null)
(4,dd,null)
结论:
我们可以看到,我们过滤器中用了age列,但是却只添加了name列,最终得出来的数据是所有数据并且age字段为null
所以,我们必须要注意:
1.只有当addColumn中包含SingleColumnValueFilter提到的字段时, 该SingleColumnValueFilter才有效的
2.如果没有指定addColumn,则默认是扫描所有列