如何设计hbase索引表?

如何设计hbase索引表?,hbase,Hbase,我需要在Hbase中设计一个索引表。例如,我的主表如下所示: Person row key: uuid --> name and address columns 我需要创建一个索引Person\u Name\u索引表,它用Person键映射名称。我的索引表如下所示: Person_Name_Index row key: name --> person row key 在person\u name\u索引中将多人行键插入行键名称的有效方法是什么?我可以将所有person行键设置为单

我需要在Hbase中设计一个索引表。例如,我的主表如下所示:

Person
row key: uuid --> name and address columns
我需要创建一个索引Person\u Name\u索引表,它用Person键映射名称。我的索引表如下所示:

Person_Name_Index
row key: name --> person row key
在person\u name\u索引中将多人行键插入行键名称的有效方法是什么?我可以将所有person行键设置为单个值,但如果需要将另一个person行键添加到名称中。我必须阅读所有内容,然后在其中添加一个新项目。如果我让每个人的行键位于单独的列中,我需要确保名称是唯一的。如果不使用uuid类型的字符串,我不知道如何做到这一点,因为它使我的表也变大了。有什么想法或建议吗


谢谢,

正如Sean在HBase中所说,建议根据您需要的数据访问路径对数据进行建模。不建议将其视为RDBMS(因为它不是)。在您的情况下,您可以将person表的键作为名称,后跟分隔符(例如管道),然后是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);

然后在扫描器上迭代查看所有同名人员

您可能做错了什么,我不理解Person\u name\u索引表的目标。为什么要使用person行键映射名称?在Hbase中,应该对数据进行非规范化。如果您没有对数据进行非规范化,那么基本上最终得到的实现与在RDBMS上使用的实现相同。我不知道您的用例,但它可能有一个解决方案,所有这些数据都在同一个表中。我想找到具有给定名称的所有用户。我可以扫描person表,但是扫描索引表更有效,不是吗?person表的用例是什么?您可能应该将名称作为person表的行键,并将所有地址放在一列中familyName不保证唯一。我不能这样做。是的,但在最后,在人名索引行中添加多个人行键与在人名行中添加多个人地址有什么区别。我的意思是这是一样的,但是你只有一个表。我使用uuid作为索引表的列族,而不是组合它们。索引表中的一行类似于:name-->muliple(uuid,person)。你认为这种方法有什么问题吗?问题是你需要两次调用才能访问数据,而不是一次调用。HBase根据键按字典顺序对数据进行排序,您可以使用PrefixFilter进行扫描(我将编辑回复以添加示例)“name”+“|”+uuid的值是多少?这是一个person还是一个空值。这将是一个完整的person记录范围扫描在这里的性能将比prefixfilter更好-即设置开始行和停止行。起始行是要搜索的名称,停止行是要搜索的名称,最后一个字节递增1。前缀过滤器将扫描表中的所有数据。