2012-06-05 54 views
1

我只是HBase的初學者。我想將RDBMS表遷移到HBase。在RDBMS什麼是最適合RDBMS表的HBase架構

表模式有點像這樣:

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 

這裏的身體和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. 

什麼將是此此時,相應的架構?

回答

0
4. Activity retrival made after t time. 

這不會是一個問題; HBase存儲所有包含時間戳的內容,您可以在時間t之後查詢所有條目。

至於1,2和3,您是否試圖快速訪問?如果是這樣,我建議創建三個單獨的表來存儲數據 - 是的,有冗餘,但查詢會很快。

  1. 使用user_id說明作爲行鍵,其餘值存儲在列
  2. 使用viewer_id爲行密鑰,並在列
  3. 使用TYPE_ID和USER_ID作爲行鍵的值的店休息,在user_id前面有type_id。這樣,如果僅提供了type_id,則可以通過type_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) 
+0

謝謝,這是有益的,我。順便說一句,我使用Java和kundera與HBase –

相關問題