原文链接是在 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
我们这里就因为时间范围扫描,用java了
没办法
好文章