问题描述
我有大量数据要存储到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(因为有盐),也不能重建行键。
解决方法
两者都需要。方法如下:
- 为避免出现热点,请添加以行键
date
和product_id
的哈希键(不是 UUID!)。应该使用简单的哈希函数,例如murmur。 - 由于
date
和product_id
的组合不是唯一,因此您还需要将值添加到行键。这可以是UUID。但是,(如果可能),在域模型中将其附加现有属性值(如果唯一)。 (我认为"1|Tom"
是记录。"1"
是唯一的吗?)
从HBase访问记录时,请通过“前缀过滤器”读取行。在这种情况下,您的前缀为:
hash(date + "_" + product_id) + "_"+ date + "_" + product_id + "_"
有关如何按前缀获取的信息,请参见setRowPrefixFilter。或者,您可以考虑使用诸如hbase-orm之类的库以面向对象的方式按前缀提取记录(公开:我是该库的作者)。