【问题标题】:how to design hbase index table?如何设计hbase索引表?
【发布时间】:2012-09-14 20:43:57
【问题描述】:

我需要在 Hbase 中设计一个索引表。比如我的主表是这样的:

Person
row key: uuid --> name and address columns

我需要创建一个索引 Person_Name_Index 表,该表将名称与 Person 键映射。我的索引表如下所示:

Person_Name_Index
row key: name --> person row key

将多个人员行键插入到 Person_Name_Index 中的行键名称的有效方法是什么?我可以将所有人员行键设为单个值,但如果我需要将另一个人员行键添加到名称中。我必须阅读所有这些,然后向其中添加一个新项目。如果我将每个人的行键放在单独的列中,我需要确保名称是唯一的。如果不使用 uuid 类型的字符串,我不知道该怎么做,这也会使我的表变大。有什么想法或建议吗?

谢谢,

【问题讨论】:

  • 你可能做错了什么,我不明白 Person_Name_Index 表的目标。为什么要使用人员行键映射名称?在 Hbase 中,您应该对数据进行非规范化。如果您不对数据进行非规范化,那么您基本上会得到与在 RDBMS 上使用的相同的实现。我不知道你的用例,但它可能有一个解决方案,所有这些数据都在同一个表中
  • 我想找到所有具有给定名称的用户。我可以扫描我的人员表,但扫描索引表更有效,不是吗?
  • person 表的用例是什么?您可能应该将名称作为 person 表的行键,并将所有地址放在一个列族中
  • 名称不保证唯一。我做不到。
  • 是的,但最后在 Person_Name_Index 行中添加多个人员行键或在人员行中添加多个人员地址之间有什么区别。我的意思是这是同一件事,但你只有一张桌子

标签: hbase


【解决方案1】:

正如 Sean 在 HBase 中所说,建议根据您需要的访问路径对数据进行建模。不建议将其视为 RDBMS(因为它不是)。在您的情况下,您可以将人员表的键作为名称,后跟分隔符(例如管道),然后是 UID - 然后您可以按名称搜索并拥有每个人的唯一 ID

String personName="Name to Search";
String delimiter="|";
PrefixFilter prefixFilter = new PrefixFilter(Bytes.toBytes(personName+delimiter));
Scan scan = new Scan();
scan.setFilter(prefixFilter);
ResultScanner resultScanner = hBaseTable.getScanner(scan);

然后在扫描仪上进行迭代以查看所有具有该名称的人

【讨论】:

  • 我使用 uuid 作为索引表的列族,而不是组合它们。索引表中的一行看起来像:name --> muliple (uuid, person)。您认为这种方法有什么问题吗?
  • 问题是您必须进行两次调用才能获取数据,而不是一次调用。 HBase根据key按字典顺序对数据进行排序,您可以使用PrefixFilter进行扫描(我将编辑回复以添加示例)
  • "name"+"|"+uuid 的值是多少?那是一个人还是一个空值。
  • 那将是一个完整的人员记录
  • 在这里,范围扫描比前缀过滤器有更好的性能——即设置开始行和停止行。开始行是要搜索的名称,停止行是要搜索的名称,最后一个字节加 1。前缀过滤器将扫描表中的所有数据。
猜你喜欢
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 2017-03-26
相关资源
最近更新 更多