我正在寻找一些关于HBase的帮助(对它很新,并试图理解我是否将它用于我的POC)。
用例: 我需要一个历史价格数据表,例如将存储10个不同指数的数据。其中一项要求是跟踪或审计对成分股或股票或工具的任何属性所做的更改。 此外,如果我想在2010年1月份找到价格变化差异为n%的工具清单。
数据,例如(一些可能性) (下面提到的列只是为了说明)
date instrument high low mid user ts
20130101 goog 34 33.4 33.8 system 10:30
20130101 yhoo 24 23.4 23.8 system 10:50
20130101 goog 34.1 33.3 33.8 ops 10:55
20130101 msft 134 133.4 133.8 system 11:00
20130101 msft 134 133.9 133.8 ops 11:30
20130101 goog 34.1 33.3 34.1 ops 11:30
20130101 aapl 48 48.4 47.9 system 11:30
随后的日期将提供类似的数据。请注意,在一天内,任何用户都可以更改乐器的属性/属性值(如goog,msft所示),有些人根本没有变化(aapl,yhoo)。
什么是最好的数据模型,我可以用来存储这些数据,从哪个检索也很容易?
如果HBase有复合rowkey(如果有的话请帮我解释一下),那么我可以有类似的东西,
ROW COLUMN+CELL
goog-20130101 column=cf1:h1, timestamp=1389020633920, value=34
goog-20130101 column=cf1:h2, timestamp=1389020654614, value=34.1
goog-20130101 column=cf1:h3, timestamp=1389020668338, value=34.1
goog-20130101 column=cf1:l1, timestamp=1389020633920, value=33.4
goog-20130101 column=cf1:l2, timestamp=1389020654614, value=33.8
goog-20130101 column=cf1:l3, timestamp=1389020668338, value=33.3
goog-20130101 column=cf1:u1, timestamp=1389020633920, value=system
goog-20130101 column=cf1:u2, timestamp=1389020654614, value=ops
goog-20130101 column=cf1:u3, timestamp=1389020668338, value=ops
aapl-20130101 column=cf1:h1, timestamp=1389020633920, value=48
aapl-20130101 column=cf1:l1, timestamp=1389020633920, value=48.4
aapl-20130101 column=cf1:u1, timestamp=1389020633920, value=system
1)我们可以创建这样的rowkeys吗?怎么样? 2)如果rowkey的数据已经存在(goog-20130101),例如那么我们如何通知/把数据放到同一个rowkey上呢?在我们的例子中,列名改为h1,l1,u1?随后到了h2,l2等。这是否可以实现? 3)如何检索最新数据及其值(例如,对日期中的goog说好话)?
或者,如果有人遇到过这样的数据(您在一天和商店中跟踪用户/对象的多个事件/活动),可以建议更适合HBase的模型。
提前感谢您的帮助。
答案 0 :(得分:0)
您可能尚未完全同化的HBase的一个方面是它自动创建和维护多个版本的单元。 单元是HBase中的{row,column,version}元组。
HBase默认保留同一单元格的三个版本 - 它可以配置为存储任意数量的版本。最大数量是在创建表时设置的。另请参阅HColumnDescriptor信息
HBase versioning info from the HBase book
因此,您可以更灵活地选择行键。
答案 1 :(得分:0)
HBase中的Rowkeys是任意字节数组,因此您可以根据需要制作它们。您可以调用Bytes.toBytes()
并将其传递给各种类型,以将rowkeys转换为适合hbase的字节数组。
hbase中没有本地方式来增加列名称,就像你想要的那样。您需要一些外部数据源来维护计数,您的应用程序代码需要读取当前版本的内容,并使用Get
请求中的新列名称进行编写。这可能是hbase中的一列,当你更新'h''l'和'u'时,你会增加。编写新列不是问题,只要它是数百万个唯一列的顺序。您可以考虑的另一种技术是在限定符中包含一个时间戳,这样它们就可以是唯一的,无需额外读取即可跟上版本更改。
要确定最新的更改,您可以阅读整行并自行处理,也可以使用过滤器,例如:ColumnPrefixFilter来检索特定范围之间的数据。
有一个项目OpenTSDB,它使用按时间划分的rowkeys的概念。它通常用于基础设施监控,但代码是开源的,因此您可以在那里找到一些有用的技术。