我有像这样的行键的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就像上面一样,但也没能给我正确的结果。
上面只是我为这个问题写的一个例子,但我希望你能理解我手边的问题。
我想使用相同的键结构并实现我想要的。这甚至可能吗?
答案 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"))));
}
}
}