1

我只是 HBase 的初学者。我想将 RDBMS 表迁移到 HBase。

RDBMS 中的表模式有点像这样:

Field            Type              Collation          Null    Key     Default  Extra             Privileges                       Comment
---------------  ----------------  -----------------  ------  ------  -------  ------------  --  -------------------------------  -------
id               int(16) unsigned  (NULL)             NO      PRI     (NULL)       auto_increment  select,insert,update,references         
user_id          varchar(64)       latin1_swedish_ci  NO      MUL     (NULL)                   select,insert,update,references         
type_id          int(11)           (NULL)             NO              (NULL)                   select,insert,update,references         
application_id   int(16) unsigned  (NULL)             YES     MUL     (NULL)                   select,insert,update,references         
title            varchar(128)      latin1_swedish_ci  YES             (NULL)                   select,insert,update,references         
body             text              latin1_swedish_ci  YES             (NULL)                   select,insert,update,references         
posted_time      datetime          (NULL)             YES             (NULL)                   select,insert,update,references         
template_params  text              latin1_swedish_ci  YES             (NULL)                   select,insert,update,references         
count            int(11)           (NULL)             YES             (NULL)                   select,insert,update,references         
reference_id     int(16)           (NULL)             YES             (NULL)                   select,insert,update,references         
viewer_id        varchar(64)       latin1_swedish_ci  YES             (NULL)                   select,insert,update,references   

这里 body 和 Templete 有 varchar 格式的 json 数据。现在我想在 HBase 中为这个表创建模式。

对此数据执行的操作:

1. Activity retrival for a user id
2. Activity retrival for a viewer id
3. Activity retrival for particular type_id/particular type_id and user_id.
4. Activity retrival made after t time.

什么是合适的模式?

4

1 回答 1

0
4. Activity retrival made after t time.

这不会是什么大问题。HBase 存储带有时间戳的所有内容,您可以查询时间 t 之后的所有条目。

至于 1、2 和 3,您是否要快速访问?如果是这样,我建议创建三个单独的表来存储数据 - 是的,存在冗余,但查询会很快。

  1. 使用 user_id 作为行键,并将其余值存储在列中
  2. 使用 viewer_id 作为行键,并将其余值存储在列中
  3. 使用 type_id AND user_id 作为行键,type_id 在 user_id 前面。这样,如果仅提供了 type_id ,则可以通过 type_id 和 user_id 查询,如果两者都提供,则可以通过 type_id 和 user_id 进行查询。(请注意,您必须在此处扫描,而不是使用常规的 get()。)

您可以使用HappyBase Python 库对此进行编码,如下所示:

con = happybase.Connection()
user = conn.table('user')
viewer = conn.table('viewer')
type_user = conn.table('type_user')

def insert (user_id, viewer_id, type_id):
  user.put (user_id, {'viewer_id': viewer_id, 'type_id': type_id})
  viewer.put (viewer_id, {'user_id': user_id, 'type_id': type_id})
  type_user.put (type_id + user_id, {'viewer_id': viewer_id})

def get_user (user_id):
  return user.row(user_id)

def get_viewer (viewer_id):
  return viewer.row(viewer_id)

def get_type_user (type_id, user_id):
  if user_id == "":
    rowkey = type_id
  else
    rowkey = type_id + user_id
  # Note that we use a scan here to match only type_id if it exists
  return type_user.scan(row_prefix=rowkey)
于 2012-06-05T20:18:28.893 回答