在hbase中搜索日期

zvokhttg  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(409)

我有一个带有行键的hbase表(delimter='#')

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

第一部分实际上是倒转的时间戳的十六进制(第二部分是时间戳)。我有这个rowkey格式,这样我就可以把键平均地分割成不同的区域。我的区域根据行键的前两个字符('00','01',…,'fe','ff')进行拆分。共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)

它给了我错误的结果。我尝试使用子串过滤器,就像上面,但也未能给我正确的结果。
以上只是我为这个问题写的一个例子,但我希望你能理解我手头的问题。
我想使用相同的密钥结构并实现我想要的。这有可能吗?

3j86kqsm

3j86kqsm1#

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

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"))));
        }
    }
}

相关问题