hbase扫描缺少列或列值为空的记录的筛选器

z4bn682m  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(467)

我在一个col家族(cf)中有3个col{col1,col2,col3}。我想写一个扫描,这样我就可以选择所有有 col1='val1' and col2='val2' and (col3 is missing or col3 is null) .
在java中执行此操作-抱歉,我对hbase完全陌生;-)

ubof19bj

ubof19bj1#

我认为以下代码可以帮助您:

  1. FilterList filterList = new FilterList();
  2. SingleColumnValueFilter filter1 = new SingleColumnValueFilter(Bytes.toBytes("someFamily"), Bytes.toBytes("col1"), CompareFilter.CompareOp.EQUAL, Bytes.toBytes("val1"));
  3. filter1.setFilterIfMissing(true);
  4. filterList.addFilter(filter1);
  5. SingleColumnValueFilter filter2 = new SingleColumnValueFilter(Bytes.toBytes("someFamily"), Bytes.toBytes("col2"), CompareFilter.CompareOp.EQUAL, Bytes.toBytes("val2"));
  6. filter2.setFilterIfMissing(true);
  7. filterList.addFilter(filter2);
  8. SingleColumnValueFilter filter3 = new SingleColumnValueFilter(Bytes.toBytes("someFamily"), Bytes.toBytes("col3"), CompareFilter.CompareOp.EQUAL, new NullComparator());
  9. filter3.setFilterIfMissing(false);
  10. filterList.addFilter(filter3);
  11. Scan scan = new Scan();
  12. scan.setFilter(filterList);
  13. ResultScanner resultScanner = table.getScanner(scan);
  14. for (Result res : resultScanner) {
  15. System.out.println(res);
  16. }
  17. resultScanner.close();
展开查看全部
tzxcd3kk

tzxcd3kk2#

我在网上很难找到答案。我终于弄明白了,其实很简单——就是没有答案:

  1. Scan scanner = new Scan();
  2. SingleColumnValueFilter filter = new SingleColumnValueFilter(
  3. Bytes.toBytes( "some family" ),
  4. Bytes.toBytes( "some column" ),
  5. CompareFilter.CompareOp.EQUAL,
  6. Bytes.toBytes( "" )
  7. );
  8. filter.setFilterIfMissing( false );
  9. scanner.setFilter( filter );
  10. return scanner;

解决方案的关键部分是设置 setFilterIfMissing 为false并与空字符串进行比较。

相关问题