你的...是n
这里??有了 RowKey 在手 - 我想你的意思是HBaserowkey - 不是一些手工制作的?? - 这对于 HBase 来说是快速/简单的。将其视为 O(1)。
如果 ROWKEY 是实际列you创建..然后there是你的问题。请改用 HBase 提供的 rowkey。
那么让我们继续 - 假设您 (a) 已经正确使用了提供的 hbaserowkey
- 或者已经修复了你的结构来这样做。
在这种情况下,您可以简单地创建一个单独的get
对于每个(rowkey, EVENT)
值如下:
Perform a `get` with the given `rowkey`.
In your result then filter out EVENT in <yourEventValues for that rowkey>
所以你最终会获取all给定行键的最近(最新时间戳)条目。与 'n' 相比,这大概很小?那么过滤就是对一列的快速操作。
您还可以通过批量执行来加快速度multiget
。节省的成本来自于减少了 HBase 主服务器的往返次数以及主服务器/区域服务器的解析/计划生成。
Update感谢OP:我对情况了解得更清楚了。我建议简单地使用“host |”作为行键。然后你可以做一个范围扫描并从单个中获取条目Get / Scan.
另一个更新
HBase 支持基于 rowkey 前缀的范围扫描。因此,您有 foobarRow1、foobarRow2、.. 等,然后您可以对 (foobarRow、foobarRowz) 进行范围扫描,它将找到具有以以下开头的行键的所有行foobarRow
- 以及后面的任何字母数字字符。
看看这个HBase(简单):如何在 hbase shell 中执行范围前缀扫描 https://stackoverflow.com/questions/17558547/hbase-easy-how-to-perform-range-prefix-scan-in-hbase-shell
这是一些说明性代码:
SingleColumnValueFilter filter = new SingleColumnValueFilter(
Bytes.toBytes("columnfamily"),
Bytes.toBytes("storenumber"),
CompareFilter.CompareOp.NOT_EQUAL,
Bytes.toBytes(15)
);
filter.setFilterIfMissing(true);
Scan scan = new Scan(
Bytes.toBytes("20110103-1"),
Bytes.toBytes("20110105-1")
);
scan.setFilter(filter);
请注意,20110103-1
and 20110105-1
提供一系列要搜索的行键。