高效查询Hbase

2024-02-13

我使用 Java 作为查询 Hbase 的客户端。

我的 Hbase 表设置如下:

ROWKEY     |     HOST     |     EVENT
-----------|--------------|----------
21_1465435 | host.hst.com |  clicked
22_1463456 | hlo.wrld.com |  dragged
    .             .             .
    .             .             .
    .             .             .

我需要做的第一件事是获取所有的列表ROWKEYs其中有host.hst.com与之相关。

我可以在 Column 创建扫描仪host对于每行值column value = host.hst.com我会添加相应的ROWKEY到列表中。看起来效率相当高。O(n)获取所有行。

现在是最困难的部分。对于每个ROWKEY在列表中,我需要获取相应的EVENT.

如果我用普通的GET命令获取单元格(ROWKEY, EVENT),我相信扫描仪是在EVENT这需要O(n)是时候找到正确的单元格并返回值了。对于每个人来说,这都是相当糟糕的时间复杂度ROWKEY。将两者结合起来给我们O(n^2).

有没有更有效的方法来解决这个问题?

非常感谢您提前提供的任何帮助!


你的...是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提供一系列要搜索的行键。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高效查询Hbase 的相关文章

随机推荐