Hbase表的最佳行键设计

Hbase表的最佳行键设计,hbase,row-key,Hbase,Row Key,我们有一个Hbase表,其中rowkey是通过连接站点+文章来准备的,即如果我有一个站点a,它销售100200300篇文章。 我的行键分别是A100、A200和A300。 现在我们只想使用项目编号扫描hbase表。 它可以出现在多个站点中。 我们尝试使用子字符串比较器执行扫描。但这需要很长时间。 对于相同的场景,有人能提出更好的salt或rowkey设计吗?在您能够交换SiteId和ArticleId之前,通过简单的rowkey重新设计似乎无法解决此问题, 但在这种情况下,按SiteId搜索也会

我们有一个Hbase表,其中rowkey是通过连接站点+文章来准备的,即如果我有一个站点a,它销售100200300篇文章。 我的行键分别是A100、A200和A300。 现在我们只想使用项目编号扫描hbase表。 它可以出现在多个站点中。 我们尝试使用子字符串比较器执行扫描。但这需要很长时间。
对于相同的场景,有人能提出更好的salt或rowkey设计吗?

在您能够交换SiteId和ArticleId之前,通过简单的rowkey重新设计似乎无法解决此问题, 但在这种情况下,按SiteId搜索也会遇到同样的问题。 这种行为的原因是HBase无论如何都不能按键的中间或最后部分优化搜索,它必须进行完整扫描

您可能想到的一些解决方案:
1.在条件为[code>rowkey==SiteIdArticleId的情况下,对每个站点执行多个并发搜索。如果站点数量相对较少,这将很快起作用。
2.执行
自定义二级索引
。第二个索引表,AtricleId作为行键,SiteId作为卖出值。
3.使用ApachePhoenix,它可以直接进行二次索引。(但首先检查它是否适合需要)

在第二种情况下,您可以从索引表中按键执行get,而不是从第一次get开始对每个单元格执行从零到多个get。这将非常快,但需要一些空间开销

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

假设您的表已收集到
SiteToArticle
,第二个表已收集到
article-site
当您执行写操作时,您会像通常一样向第一个表和第二个表写入,如
{“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);
byte[]articleId=“articleId”.getBytes();
Get=new Get(articleId).readAllVersions();
Table t=connection.getTable(TableName.valueOf(“ArticleToSite”);
List gets=new ArrayList();
对于(单元格c:t.get(get).getColumnCells(“CF.getBytes(),“SiteId.getBytes())){
byte[]key=Bytes.add(CellUtil.cloneValue(c),“:”.getBytes(),articleId);
add(新的Get(key));
}
返回connection.getTable(TableName.valueOf(“SiteToArticle”).get(gets);

谢谢您的回复。请详细说明第二个选项好吗?如果你能推荐一些已经创建了自定义二级索引的博客,那将非常有帮助。我已经更新了我的答案。您还可以查看更多详细信息。但是,维护两个包含15亿条记录的表是否合适?因为我们有1000多个网站和多篇文章在这些网站上。这是一个加快查询速度的折衷方案。但是,如果你只有大约1000个站点,我认为最好将它们存储在内存存储中,当你需要按id获取文章时,你可以为每个站点生成一个
get