hbase的SingleColumnValueFilter和addColumn的坑

问题:
最近在查一张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.测试数据:
hbase的SingleColumnValueFilter和addColumn的坑_第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,则默认是扫描所有列

你可能感兴趣的:(hbase,hbase,大数据,hadoop)