使用RowFilter无法正常查询HBase表

我有一个HBase表(来自java),我想通过键列表查询表。 我做了以下,但它不起作用。

mFilterFeatureIt = mFeatureSet.iterator(); FilterList filterList=new FilterList(FilterList.Operator.MUST_PASS_ONE); while (mFilterFeatureIt.hasNext()) { long myfeatureId = mFilterFeatureIt.next(); System.out.println("FeatureId:"+myfeatureId+" , "); RowFilter filter = new RowFilter(CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes(myfeatureId)) ); filterList.addFilter(filter); } outputMap = HbaseUtils.getHbaseData("mytable", filterList); System.out.println("Size of outputMap map:"+ outputMap.szie()); public static Map<String, Map> getHbaseData(String table, FilterList filter) { Map<String, Map> data = new HashMap<String, Map>(); HTable htable = null; try { htable = new HTable(HTableConfiguration.getHTableConfiguration(),table); Scan scan = new Scan(); scan.setFilter(filter); ResultScanner resultScanner = htable.getScanner(scan); Iterator results = resultScanner.iterator(); while (results.hasNext()) { Result result = results.next(); String rowId = Bytes.toString(result.getRow()); List columns = result.list(); if (null != columns) { HashMap colData = new HashMap(); for (KeyValue column : columns) { colData.put(Bytes.toString(column.getFamily()) + ":"+ Bytes.toString(column.getQualifier()),Bytes.toString(column.getValue())); } data.put(rowId, colData); } } } catch (IOException e) { e.printStackTrace(); } finally { if (htable != null) try { htable.close(); } catch (IOException e) { e.printStackTrace(); } } return data; } 

FeatureId:80515900,FeatureId:80515901,FeatureId:80515902,

outputMap的大小:0

我看到functionID的值是我想要的,但即使密钥存在于hbase表中,我总是得到上面的输出。 谁能告诉我我做错了什么?

编辑:我上面发布了我的hbase util方法的代码,以便你可以指出我的任何错误。

我正在尝试做一个SQL等价的select * FROM mytable where featureId in (80515900, 80515901, 80515902)我想在HBase中实现相同的想法是为每个featureId创建一个带有一个filter的filter列表。 那是对的吗 ?

这是我桌子的内容

 scan 'mytable', {COLUMNS => ['sample:tag_count'] } 80515900 column=sample:tag_count, timestamp=1339304052748, value=4 80515901 column=sample:tag_count, timestamp=1339304052748, value=0 80515902 column=sample:tag_count, timestamp=1339304052748, value=3 80515903 column=sample:tag_count, timestamp=1339304052748, value=1 80515904 column=sample:tag_count, timestamp=1339304052748, value=2 

它在将数据插入hbase时没有返回任何数据,
key的数据类型是’String’(来自扫描结果)&在获取时,RowFilter中传递的值具有’long’数据类型。 使用此filter:

 RowFilter filter = new RowFilter(CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes(myfeatureId.toString())) ); 

while循环将始终生成一个新filter并添加到filter列表中

电路是滤波器中的所有键。 此filter永远不会应用于单个行 。 在while循环中只创建一个指向知道“myfeatureId”的filter。

 while (mFilterFeatureIt.hasNext()) { long myfeatureId = mFilterFeatureIt.next(); System.out.println("FeatureId:"+myfeatureId+" , "); if ( myfeatureId=="80515902") { RowFilter filter = new RowFilter(CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes(myfeatureId)) ); filterList.addFilter(filter); } } 

编辑

对于行数量,查询负责。 HBase不是

HBasefilter

过滤推送行选择标准到HBase。 可以远程和并行过滤行。 使用这些function可以帮助您避免向客户端发送不需要的行。

要从密钥中获取一部分,请从80515900获取所有内容.. 80515909试试这个

当然从循环中删除

 RowFilter filter = new RowFilter(CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes(myfeatureId)) ); filterList.addFilter(filter); 

并添加上面的行outputMap = HbaseUtils.getHbaseData("mytable", filterList);

 .... RowFilter filter = new RowFilter(CompareOp.EQUAL,new SubStringComparator("8051590")); filterList.addFilter(filter); outputMap = HbaseUtils.getHbaseData("mytable", filterList);