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.测试数据:
在这里插入图片描述
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,则默认是扫描所有列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值