编程语言
首页 > 编程语言> > java – 有效地查询Hbase

java – 有效地查询Hbase

作者:互联网

我正在使用Java作为查询Hbase的客户端.

我的Hbase表设置如下:

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

我需要做的第一件事是获取所有与其关联的host.hst.com的ROWKEY列表.

我可以在Column主机上创建一个扫描程序,并使用列值= host.hst.com为每个行值创建一个扫描程序.我将相应的ROWKEY添加到列表中.看起来效率很高. O(n)用于获取所有行.

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

如果我使用普通的GET命令来获取单元格(ROWKEY,EVENT),我相信在EVENT创建一个扫描器,需要花费O(n)时间来找到正确的单元格并返回该值.对于每个ROWKEY来说,这是非常糟糕的时间复杂性.将两者结合起来得到O(n ^ 2).

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

非常感谢您提前帮助!

最佳答案:

你在这?有了RowKey – 我认为你的意思是HBase的rowkey – 而不是一些手工制作的? – 这对HBase来说很快/容易.认为是O(1).

如果相反,ROWKEY是您创建的实际列..那么就存在问题.请改用HBase提供的rowkey.

所以让我们继续 – 假设您(a)已经正确使用了hbase提供的rowkey – 或者已经修复了您的结构.

在这种情况下,您只需为每个(rowkey,EVENT)值创建一个单独的get,如下所示:

Perform a `get` with the given `rowkey`. 
In your result then filter out EVENT in <yourEventValues for that rowkey>

因此,您将最终获取给定rowkey的所有最新(最新时间戳)条目.与’n’相比,这可能是小的?然后,过滤是对一列的快速操作.

您还可以通过执行批量复制来加快速度.节省来自减少到HBase主站的往返和主/区域服务器生成的解析/计划.

更新感谢OP:我更清楚地了解情况.我建议只使用“host |”作为rowkey.然后,您可以执行范围扫描并从单个“获取/扫描”中获取条目.

另一个更新

HBase支持基于rowkey前缀的范围扫描.所以你有foobarRow1,foobarRow2,..等你可以对(foobarRow,foobarRowz)进行范围扫描,它会找到所有行的行,这些行以foobarRow开头 – 并且后面跟着任何字母数字字符.

看看这个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和20110105-1提供了一系列要搜索的行键.

标签:java,hadoop,mapreduce,hbase,hadoop2
来源: https://codeday.me/bug/20190516/1115353.html