Hbase表的最佳行键设计[关闭]

问题描述 投票:-1回答:1
我们有一个Hbase表,其中的行键是通过串联Site + Article来准备的,即,如果我有站点A出售100,200,300个商品编号。我的行键分别是A100,A200,A300。现在,我们只想使用商品编号来扫描hbase表。可以存在于多个站点中。我们尝试使用子串比较器执行扫描。但是要花很长时间。任何人都可以针对相同的情况提出更好的解决方案或行键设计。
hbase row-key
1个回答
1
投票
在您可以交换SiteId和ArticleId之前,似乎似乎可以通过简单的行键重新设计来解决此问题,但是在这种情况下,按SiteId搜索会遇到相同的问题。出现这种情况的原因是,HBase无论如何都无法通过键的中间或最后部分来优化搜索,而必须进行完整扫描。

您可能会想到的一些解决方案:1.在条件为rowkey == SiteIdArticleId的情况下,每个站点进行多个并发搜索。如果您的网站数量相对较少,则此方法会快速运行。2.进行custom secondary index。第二个索引表,其中AtricleId作为rowkey,SiteIds作为Sell值。3.使用Apache Phoenix开箱即可进行二级索引。 (但是先检查是否适合需要)

在第二种情况下,您可以从索引表中按键执行get,然后从第一个get中为每个单元格执行从零到多个get的操作。这将非常快地运行,但是需要一些空间开销。

第二个选项,更多详细信息:

假设您的表排序为SiteToArticle,第二个表排序为ArticleToSite当您执行写操作时,您会像平时一样将两个表都写入第一个表,并像{"rowkey"=ArticleId, "SiteId"=siteId}写入第二个表

[读取时,首先从ArticleToSite中读取,然后遍历每个SiteId,使用键SiteId:ArticleId创建新的get,然后执行第二批get。代码大概看起来像这样:

byte[] articleId = "ArticleId".getBytes(); Get get = new Get(articleId).readAllVersions(); Table t = connection.getTable(TableName.valueOf("ArticleToSite")); List<Get> gets = new ArrayList<>(); for (Cell c : t.get(get).getColumnCells("CF".getBytes(), "SiteId".getBytes())) { byte[] key = Bytes.add(CellUtil.cloneValue(c), ":".getBytes(), articleId); gets.add(new Get(key)); } return connection.getTable(TableName.valueOf("SiteToArticle")).get(gets);

© www.soinside.com 2019 - 2024. All rights reserved.