1

我有一个 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<String, String>> getHbaseData(String table, FilterList filter) {

    Map<String, Map<String, String>> data = new HashMap<String, Map<String, String>>();
HTable htable = null;
try {
    htable = new HTable(HTableConfiguration.getHTableConfiguration(),table);
    Scan scan = new Scan();
    scan.setFilter(filter);

    ResultScanner resultScanner = htable.getScanner(scan);
    Iterator<Result> results = resultScanner.iterator();

    while (results.hasNext()) {

    Result result = results.next();
    String rowId = Bytes.toString(result.getRow());
    List<KeyValue> columns = result.list();
    if (null != columns) {

    HashMap<String, String> colData = new HashMap<String, String>();
    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

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

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

我正在尝试做一个与select * FROM mytable where featureId in (80515900, 80515901, 80515902)我的想法等效的 SQL,以在 HBase 中实现相同的目的是创建一个过滤器列表,其中每个 featureId 都有一个过滤器。那是对的吗 ?

这是我表的内容

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                                                                                                
4

2 回答 2

3

它不返回任何数据,因为在将数据插入 hbase 时,
键的数据类型是“字符串”(来自您的扫描结果),并且在获取时,在 RowFilter 中传递的值具有“长”数据类型。使用此过滤器:

RowFilter filter = new RowFilter(CompareOp.EQUAL,new    
BinaryComparator(Bytes.toBytes(myfeatureId.toString())) );
于 2012-06-19T13:28:34.047 回答
0

while 循环总是会生成一个新的过滤器并添加到过滤器列表中

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

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 不是

HBase 过滤器

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

要从钥匙中取出一部分,请从 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);
于 2012-06-10T21:58:28.333 回答