在 Hbase 中的日期之间搜索
Searching between dates in Hbase
我有 Hbase table 和 rowKeys (delimter = '#')
0CE5C485#1481400000#A#B#C#T
00C6F485#1481600000#F#J#C#G
065ED485#1481500000#T#X#C#G
...
...
第一部分实际上是时间戳的十六进制反转(第二部分是时间戳)。我有这种 rowkey 格式,这样我就可以将密钥均匀地分成不同的区域。我的区域根据 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)
它给了我错误的结果。我试过像上面那样使用 SubStringFilter,但也没有给我正确的结果。
以上只是我为问题写的一个例子,希望你能理解我手头的问题。
我想使用相同的键结构并实现我想要的。这可能吗?
我建议使用时间范围过滤器。
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"))));
}
}
}
Scan.setTimeRange()
用于过滤时间范围内columns/cells的VERSIONS。它与行键过滤无关。参见 https://javadoc.io/doc/org.apache.hbase/hbase-client/1.0.0/org/apache/hadoop/hbase/client/Scan.html#setTimeRange(long,%20long)
行键是按字典顺序排序的,所以我相信 HEX 代码应该是行键的第二个字段。然后你可以只使用 partial-key 扫描 api 这比过滤器快得多。例如
Scan.setStartRow(Bytes.getBytes("1481400000"));
Scan.setStopRow(Bytes.getBytes("1481500000"));
我有 Hbase table 和 rowKeys (delimter = '#')
0CE5C485#1481400000#A#B#C#T
00C6F485#1481600000#F#J#C#G
065ED485#1481500000#T#X#C#G
...
...
第一部分实际上是时间戳的十六进制反转(第二部分是时间戳)。我有这种 rowkey 格式,这样我就可以将密钥均匀地分成不同的区域。我的区域根据 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)
它给了我错误的结果。我试过像上面那样使用 SubStringFilter,但也没有给我正确的结果。
以上只是我为问题写的一个例子,希望你能理解我手头的问题。
我想使用相同的键结构并实现我想要的。这可能吗?
我建议使用时间范围过滤器。
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"))));
}
}
}
Scan.setTimeRange()
用于过滤时间范围内columns/cells的VERSIONS。它与行键过滤无关。参见 https://javadoc.io/doc/org.apache.hbase/hbase-client/1.0.0/org/apache/hadoop/hbase/client/Scan.html#setTimeRange(long,%20long)
行键是按字典顺序排序的,所以我相信 HEX 代码应该是行键的第二个字段。然后你可以只使用 partial-key 扫描 api 这比过滤器快得多。例如
Scan.setStartRow(Bytes.getBytes("1481400000"));
Scan.setStopRow(Bytes.getBytes("1481500000"));