在Hbase中搜索日期

时间:2016-12-10 21:14:27

标签: sorting hadoop mapreduce hbase lexicographic

我有像这样的行键的Hbase表(分隔='#')

0CE5C485#1481400000#A#B#C#T
00C6F485#1481600000#F#J#C#G
065ED485#1481500000#T#X#C#G
...
...

第一部分实际上是时间戳颠倒的十六进制(第二部分是时间戳)。我有这个rowkey格式,以便我可以均匀地将键分成不同的区域。我的区域根据rowKey的前两个字符进行拆分(' 00',' 01',...,' FE'' FF& #39)。总共256个

有没有办法在两个时间戳之间获取所有行而不覆盖值中的时间戳?

I tried RegexComparators on top of Row Filters
e.g.
FilterList f = new FilterList(FilterList.Operator.MUST_PASS_ALL)
Filter f1 = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,new RegexComparator(".*1481400000")
Filter f2 = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,new RegexComparator(".*1481600000")

f.add(f1)
f.add(f2)

它给了我错误的结果。我尝试使用SubStringFilter就像上面一样,但也没能给我正确的结果。

上面只是我为这个问题写的一个例子,但我希望你能理解我手边的问题。

我想使用相同的键结构并实现我想要的。这甚至可能吗?

1 个答案:

答案 0 :(得分:2)

我建议使用时间范围过滤器。

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;

public class test {
    public static void main (String[] args) throws IOException {
        HTable table = new HTable(HBaseConfiguration.create(), "t1");
        Scan s = new Scan();
        s.setMaxVersions(1);
// you can use time range filter sfor 
        s.setTimeRange (1481400000L, 1481600000L);
        ResultScanner scanner = table.getScanner(s);
        for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
            System.out.println(Bytes.toString(rr.getRow()) + " => " +
                    Bytes.toString(rr.getValue(Bytes.toBytes("f1"), Bytes.toBytes("a"))));
        }
    }
}