1

来自 SQL Server 背景,我是 HBase 方面的新手,但该技术看起来非常适合我们正在做的事情,而且成本绝对合适!

我需要维护一个日志条目列表,通常我会在 RDBS 中创建这些条目:

创建表日志(UserID int、SiteID int、Page varchar(50)、Date smalldatetime)

一个用户在这个简单的表中可能有 0 或 1000 行。典型的查询是在一个站点上查找一位用户的所有行或一位用户的所有行。

这如何转化为 HBase 中没有“行键”且相同(SiteID,Page)可能多次出现的“地图”。我的第一个想法是 UserID 是一个行键,但我仍然不太了解“列族”和其他术语,无法理解如何设置表来保存一个 UserID 可以有很多的数据(SiteID、Page ,日期)“行”。

任何方向表示赞赏!

4

3 回答 3

1

我的建议是将您的UserId作为 Rowkey,将任何单个列族作为不必要的多个列族只会增加查找所需的时间,并将siteId|date作为列限定符,以便它始终是唯一的并且值为该限定符将是您的页面

RowKey Qualifier                       Value

001    C:site001|25/01/2013:6:17:17    www.example123.com/home
001    C:site001|25/01/2013:6:17:18    www.example123.com/about
001    C:site002|25/01/2013:6:30:17    www.example1123.com/
001    C:site003|25/01/2013:6:32:18    www.example1123.com/contact
002    C:site001|25/01/2013:2:22:17    www.example123.com/home
003    C:site001|25/01/2013:3:12:18    www.example123.com/about
003    C:site003|25/01/2013:5:30:17    www.example1223.com/
003    C:site004|25/01/2013:6:32:18    www.exampleABC.com/contact

`

希望它有效!

于 2013-01-25T12:45:14.450 回答
1

最初只是把它看作

  • RowKey:限定符:值,

表示 - 12_Aug_2013_00:00 :*- Temp =24, - Humidity =15, - FileghtsDelayed =17

  • RowKey:限定符:值,
  • 12_Aug_2013_00:00 :温度:24
  • 12_Aug_2013_00:00 :湿度:15

现在,再深入一点,如果我们可以将限定符分组到一个列族中会怎样。

例如:

  • 让分组、温度、湿度、气压作为WeatherDetails
  • 让我们分组,分组 *No_FileghtsDelayed*,*No_FlightsCancelled*,作为eventsConts

  • 我们有 WeatherDetails 和 eventsConts,作为列族

我们有 - Date_Hour : WeatherDetails : EventDetails: 例如,对于 12_Auguest_2013 FirstHour 记录的数据可以表示为

  • 12_Aug_2013_00:00WeatherDetails - Temp =24,WeatherDetails - Humidity =15,eventsConts - FileghtsDelayed =17

这种分组是为了优化获取操作。

于 2013-08-29T06:38:16.320 回答
0

一种方法是使用您的用户 ID+站点 ID 制作复合行键

设置表格以维护给定页面所需的任意数量的日志条目,并每次将数据存储为新版本(如有必要,手动设置时间戳)。

由于 HBase 维护每个单元格的时间戳,因此您不需要单独的列来记录访问时间。

因此,您将拥有一个包含类似内容的表格

Row             Page

user1:site1     www.example.com/index.html@1234567890
                www.example.com/somepage.html@123456800
                www.example.com/someotherpage.html@123456900
                www.example.com/index.html@123457123

user1:site2     blahblah

user2:site1     etc...

要处理您的两个示例请求:

要查找所有用户行,您将执行从 userx:0 到 userx+1:0 的扫描(确保设置 maxVersion),然后从每个结果行中解析出站点 ID

要获取特定用户/站点的所有页面,只需从 userx:sitex 扫描到 userx:sitex+1。最后我检查了你不能在 get 上设置 maxVersions,所以这不是一个选项。

简而言之,列族代表您想要存储在一起的数据组......大概您会经常同时从它们读取数据。将列放在不同的族中会导致数据被单独存储,因此当您只需要一列时可以更快地读取,但您需要读取 2 个不同的位置才能获取两列。

当然,根据您的其他需求,您可能希望采取不同的方法。我强烈建议阅读大表论文以更好地理解 HBase 的结构(因为它强烈基于 bigtable)。

为了更好地了解 HBase 的内部结构,Lars George 的博客也很棒。

于 2010-05-15T10:40:34.540 回答