用于时间范围查询的Hbase行键设计

用于时间范围查询的Hbase行键设计,hbase,Hbase,我需要获得从开始日期到结束日期的产品页面视图。所以我像这样设计Hbase rowkey ProductId(md5)_productId_dateKey(yyyymmdd) d:pageview. 示例:productId是1180560。8月1日至8月30日的rowkey将为: 0f0e02e9e24c29ad2c2b28e37e4f250b_1180560_20150801 ..... 0f0e02e9e24c29ad2c2b28e37e4f250b_1180560_20150830

我需要获得从开始日期到结束日期的产品页面视图。所以我像这样设计Hbase rowkey

ProductId(md5)_productId_dateKey(yyyymmdd)  d:pageview.
示例:productId是1180560。8月1日至8月30日的rowkey将为:

0f0e02e9e24c29ad2c2b28e37e4f250b_1180560_20150801

.....

0f0e02e9e24c29ad2c2b28e37e4f250b_1180560_20150830
因此,我将通过扫描带有开始行、停止行的rowkey,轻松获得时间范围内的产品页面视图

我的问题是:

这种设计是否避免了热点

rowkey的长度似乎太长了。这会影响演出吗

是否有一种方法可以缩短行键,同时确保避免热点、碰撞


这种情况下有更好的设计吗?

热插拔:最好不要使用顺序行键,即使可以获得更好的扫描结果。更多信息

行键长度-存储每个单元格的行键详细信息、列族和限定符详细信息。因此,最好尽可能地保留它们,主要是因为相同的信息在大规模重复


因此,下一步是什么?salt的用法及其前缀将有助于在区域服务器之间分配行。可以帮助您

您不需要md5您的productId。只需根据您想要的区域服务器的编号计算余数。i、 e.钥匙分离

因此,如果您想要0到4(总共5次分割),那么您需要将密钥构建为

Bytes(StringValue(productID%5)) + Bytes(productId) + Bytes(timestamp) 
例如,产品id 1180560

1180560%5=0
Bytes.toBytes(1180560)
Bytes.toBytes(timestamp)
现在,您可以使用前缀扫描来查询数据

Java中获取同一产品5天数据的示例代码:

final Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -2); // deduct 2 days
byte[] STARTROW = Bytes.add(Bytes.toBytes( productID%5),Bytes.toBytes(productID),Bytes.toBytes(cal.getTime().getTime()));
cal.add(Calendar.DATE, +3); //add 3 days
byte[] ENDTROW = Bytes.add(Bytes.toBytes( productID%5),Bytes.toBytes(productID),Bytes.toBytes(cal.getTime().getTime()));
byte[] prefix = Bytes.add(Bytes.toBytes(String.valueOf(remainder)), 
Scan scan = new Scan(STARTROW,ENDTROW);
scan.setFilter(prefixFilter);

看起来我的设计是正确的,但行键长度是49个字符。可以吗?