2013-03-02 65 views
0

由于数据增加,我正在从mysql迁移到hbase。hbase rowkey设计

我正在设计用于高效访问模式的rowkey。

我想实现3个目标。

  1. 获取电子邮件地址的所有结果
  2. 获取电子邮件地址的所有结果+ ITEM_TYPE
  3. 获取特定电子邮件地址的所有结果+ ITEM_ID

我有4个属性从

选择
  1. 用户电子邮件
  2. 反向时间戳
  3. ITEM_TYPE
  4. ITEM_ID

我应该我rowkey模样高效地获取行?

感谢

+0

您能否提供等效的SQL来实现您的目标? – ericson 2013-03-03 06:35:16

+0

select * from table where email =“xyz”and item_type = 2 order by ts desc ...我在(email,item_type,item_id)上有唯一的键索引 – 2013-03-03 06:51:56

+0

在'where'语句中'email'和'item_type'是强制的?你有类似'select * from table where email =“xyz”'或'select * from table where item_type = 2'吗?你已经提到你想在你的文章中“获取特定item_id的所有结果”。我没有看到你的SQL。 – ericson 2013-03-03 07:00:36

回答

0

也许你是在正确的方向尽可能级联排按键已经领导:在任何情况下,以下内容出自您的文章介意:

分区键可能包括你的反向时间戳加的最经常被查询的自然钥匙 - 这是电子邮件吗?让我们假设如此:然后根据两者中的哪一个(反向时间戳vs电子邮件)提供数据的最平衡/非偏斜分布来选择前缀。这使您的区域服务器更快乐。

根据更好的平衡分配记录进行选择: 反向时间戳加上最常查询的自然键 reversetimestamp-email 或email-reversetimestamp

以这种方式,您将避免在您的区域服务器上出现热点。 。

为了获得额外(次要)索引的良好性能,这还没有“融入”hbase:他们有一个设计文档(查看维基中的SecondaryIndexing)。

但是你可以建立自己的几个方法:

一)使用协处理器写的ITEM_TYPE为rowkey到tabole是原始(USER_EMAIL反向时间戳(反之亦然)的列分开的事实b)如果磁盘空间没有问题和/或行很小,只需继续并在第二个(和item-id情况下的第三个)表中复制整个行。

1

假设你的主要通道是通过电子邮件,你可以有你的主表键 电子邮件+反向时间+ ITEM_ID(假设ITEM_ID让你的独特性)

你可以有一个额外的“指标”表电子邮件+ ITEM_TYPE +反向时间+ item_id和电子邮件+ item_id作为映射到第一个表的关键字(因此通过这些检索是两步过程)

+0

好吧,我可以保留item_type作为列限定符..所有列限定符索引hbase? – 2013-03-04 17:12:58

+0

您可以将所有数据添加为列,但HBase并不真正对任何内容进行索引。它的功能是通过按键以字典形式存储数据,以便轻松找到它,但它不是数据库意义上的索引。 – 2013-03-04 17:39:28