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