python使用happybase thrift库实现hbase的scan搜索

原文链接是在    http://xiaorui.cc 

我想有些人可能不太懂python thrift scan的用法,我这边写个我自己常用的一个场景实现,查看某个列族里面以xxx开头的 …  恩, 先用happybase实现一个简单的scan,row_prefix的实现… …

import happybase 

connection = happybase.Connection('你的ip地址哈') 
table = connection.table('sl_status_sina') 


for key, data in table.scan(row_prefix='"xiaorui.cc"',limit=10000,batch_size=10): 
    print key, data

跑完简单的例子,咱们来看下happybase scan函数的具体描述… …

scan(row_start=None, row_stop=None, row_prefix=None, columns=None, filter=None, timestamp=None, include_timestamp=False, batch_size=1000, scan_batching=None, limit=None, sorted_columns=False)

Create a scanner for data in the table.


Parameters: 
row_start (str) – the row key to start at (inclusive)
row_stop (str) – the row key to stop at (exclusive)
row_prefix (str) – 
columns (list_or_tuple) – 列族
filter (str) – 这是一个过滤器
timestamp (int) – timestamp (optional)
include_timestamp (bool) – whether timestamps are returned
batch_size (int) – 一次批量获此的个数
scan_batching (bool) – server-side scan batching (optional)
limit (int) – 返回个数的控制
sorted_columns (bool) – 是否返回一个排序后的列表

除了用row_start,row_stop 这样的rowkey来控制数据扫描的范围外…. 如果你的rowkey是那种无时间特性的,那么你肯定会想用 setTimeRange来控制scan扫描的范围。。。。   下面是在hbase shell下进行的…. 

hbase(main):073:0> scan ‘t1’, { TIMERANGE => [1362672126412, 1362672134437]}
ROW                                      COLUMN+CELL                                                                                                         
 row1                                    column=f1:a, timestamp=1362672126412, value=value1                                                                  
1 row(s) in 0.0060 seconds

hbase(main):074:0> scan ‘t1’, { TIMERANGE => [1362672126412, 1362672134438]}
ROW                                      COLUMN+CELL                                                                                                         
 row1                                    column=f1:a, timestamp=1362672126412, value=value1                                                                  
 row1                                    column=f1:b, timestamp=1362672134437, value=value2                                                                  
1 row(s) in 0.0070 seconds

但是问题来了,查了下happybase和python原生的thrift库,都是不支持timestamp时间范围扫描的… 不支持的原因主要是thrift serve人不支持timestamp range  

我在国外的论坛看到了解决的办法,是使用hbase stargate做restful api服务。 

Cell or Row Query (Multiple Values)

GET /<table>/<row> 
  ( / ( <column> ( : <qualifier> )? 
      ( , <column> ( : <qualifier> )? )+ )? 
    ( / ( <start-timestamp> ‘,’ )? <end-timestamp> )? )? 
  ( ?v= <num-versions> )? 

详细的stargate的文档,请关注下 http://wiki.apache.org/hadoop/Hbase/Stargate

注释:   跟朋友又看了下 happybase代码库里面的issue,有人回复thrift2是支持timerange的… … 

getTimeRange
public TTimeRange getTimeRange()
setTimeRange
public TScan setTimeRange(TTimeRange timeRange)
unsetTimeRange
public void unsetTimeRange()
isSetTimeRange
public boolean isSetTimeRange()
Returns true if field timeRange is set (has been assigned a value) and false otherwise


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

3 Responses

  1. 往往 2015年4月27日 / 上午7:37

    我们这里就因为时间范围扫描,用java了

  2. 往往 2015年4月22日 / 下午3:28

    好文章

发表评论

邮箱地址不会被公开。 必填项已用*标注