HBase:如何设计此行键?

问题描述

我有大量数据要存储到HBase中。基本上是包含产品信息的csv文件:

date|product_id|client_id|client_name
2020-08-02|152341|1|Tom
2020-08-02|152341|2|Kate

用户应该能够通过(date,product_id)(应为API参数)检索产品信息列表。 (日期,product_id)不是唯一

在这种情况下,如何在HBase中设计行键?

由于(date,product_id)不是唯一的,因此在将数据插入HBase时必须为其添加UUID。因此它看起来像这样:2020-08-02_152341_[UUID]。可以正常工作,但是在这种情况下会出现热点问题。

但是,如果我添加盐/哈希之类的01-2020-08-02_152341_[UUID],我怎么知道UUID是什么?它不是用户输入的一部分。所以我既不能使用startKey / endKey(因为有盐),也不能重建行键。

解决方法

两者都需要。方法如下:

  • 为避免出现热点,请添加以行键dateproduct_id的哈希键(不是 UUID!)。应该使用简单的哈希函数,例如murmur
  • 由于dateproduct_id的组合不是唯一,因此您还需要值添加到行键。这可以是UUID。但是,(如果可能),在域模型中将其附加现有属性值(如果唯一)。 (我认为"1|Tom"是记录。"1"是唯一的吗?)

从HBase访问记录时,请通过“前缀过滤器”读取行。在这种情况下,您的前缀为:

hash(date + "_" + product_id) + "_"+ date + "_" + product_id + "_"

有关如何按前缀获取的信息,请参见setRowPrefixFilter。或者,您可以考虑使用诸如hbase-orm之类的库以面向对象的方式按前缀提取记录(公开:我是该库的作者)。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...