java - 如何有效地为扫描仪编写带有时间戳的过滤器

标签 java hbase

我有一个 hbase 表,其中所有键都具有以下结构 ID、DATE、OTHER_DETAILS 例如:

10,2012-05-01,"some details"
10,2012-05-02,"some details"
10,2012-05-03,"some details"
10,2012-05-04,"some details"

...

如何编写一个扫描来获取早于某个日期的所有行? 例如,2012-05-01 和 2012-05-02 早于 2012-05-03。

 Scan scan = new Scan();
 Filter f = ???   
 scan.setFilter(f);
 scan.setCaching(1000);
 ResultScanner rs = table.getScanner(scan);

最佳答案

您可以创建自己的 Filter并实现方法filterRowKey 。为了使扫描更快,您还可以实现方法 getNextKeyHint ,但这有点复杂。这种方法的缺点是您需要将带有过滤器的 jar 文件放入 HBase 类路径中并重新启动集群。

此过滤器的大致实现。

@Override
public void reset() {
    this.filterOutRow = false;
}

@Override
public Filter.ReturnCode filterKeyValue(KeyValue v) {
    if(this.filterOutRow) {
        return ReturnCode.SEEK_NEXT_USING_HINT;
    }
    return Filter.ReturnCode.INCLUDE;
}

@Override
public boolean filterRowKey(byte[] data, int offset, int length) {
    if(startDate < getDate(data) && endDate > getDate(data)) {
        this.filterOutRow = true;
    }
    return this.filterOutRow;
}

@Override
public KeyValue getNextKeyHint(KeyValue currentKV) {
    if(getDate(currentKV) < startDate){   
         String nextKey = getId(currentKV)+","+startDate.getTime();
         return KeyValue.createFirstOnRow(Bytes.toBytes(nextKey));
    }
    if(getDate(currentKV) > endDate){   
         String nextKey = (getId(currentKV)+1)+","+startDate.getTime();
         return KeyValue.createFirstOnRow(Bytes.toBytes(nextKey));
    }
    return null;  
}

@Override
public boolean filterRow() {
    return this.filterOutRow;
}

关于java - 如何有效地为扫描仪编写带有时间戳的过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14025312/

相关文章:

java - 如何提前获取我的 Button 的尺寸?

java - 无法找到或加载 oracle.jdbc.driver.OracleDriver

hadoop - 如何将 HBase 表强制到区域服务器

具有多个范围的 HBase 扫描

mysql - 使用 Mapping 连接两个表并获得结果

java - 如何使用netbeans将javadb或hsqldb嵌入到带有hibernate的java应用程序中?

java - 保存 SWT Widget 对象的集合

java - ServletFileUpload 异常

java - hbase与java客户端的连接

java - 如何从Hbase加载最新的100行到Spark