happybase table.scan()和hbase thrift scannerGetList()

时间:2015-06-19 13:50:08

标签: python hbase thrift happybase

我有两个版本的python脚本,它在hbase中扫描表中的1000行。 第一个使用happybase,如https://happybase.readthedocs.org/en/latest/user.html#retrieving-rows

while variable:
    for key, data in hbase.table(tablename).scan(row_start=new_key, batch_size=1000, limit=1000):
        print key
    new_key = key

第二个使用hbase thrift接口,如http://blog.cloudera.com/blog/2014/04/how-to-use-the-hbase-thrift-interface-part-3-using-scans/

scanner_id = hbase.scannerOpenWithStop(tablename, '', '', [])
data = hbase.scannerGetList(scanner_id, 1000) 
while len(data):
    for dbpost in data:
        print row_of_dbpost
    data = hbase.scannerGetList(scanner_id, 1000)

数据库中的行是数字。所以我的问题是在某一行中发生了一些奇怪的事情:

happybase打印(行):

... 100161632382107648 
10016177552 
10016186396 
10016200693 
10016211838 
100162138374537217 (point of interest) 
193622937692155904 
193623435597983745...

和thrift_scanner打印(行):

... 100161632382107648 
10016177552 
10016186396 
10016200693 
10016211838 
100162138374537217 (point of interest)
100162267416506368 
10016241167 
10016296927 ...

并且这不是在接下来的1000行(row_start = new_scan或next data = scannerGlockList)中发生的,而是在批处理中间。它每次都会发生。

我会说使用scannerGregList的第二个脚本正确。

为什么happybase采用不同的方式?是考虑时间戳还是其他一些内部的happybase / hbase逻辑?它最终会以不同的顺序扫描整个表吗?

PS。我知道happybase版本将扫描并打印第1000行两次,而scannerGackList将忽略下一个数据中的第一行。这不是重点,魔法发生在1000行批次中间。

1 个答案:

答案 0 :(得分:3)

我不确定您的数据,但这些循环并不相同。您的Thrift版本仅使用一个扫描仪,而您的Happybase示例重复创建一个新的扫描仪。此外,您的Happybase版本强加了扫描仪限制,而您的Thrift版本则没有。

使用Thrift,您需要进行簿记,并且您需要重复代码(scannerGetList()调用)进行循环,因此可能会导致您的混淆。

使用Happybase的正确方法就是这样:

table = connection.table(tablename)
for key, data in table.scan(row_start=new_key, batch_size=1000):
    print key
    if some_condition:
        break  # this will cleanly close the scanner

注意:此处没有嵌套循环。其他好处是,当您完成扫描时,Happybase将正确关闭扫描仪,而您的Thrift版本则没有。