我有两个版本的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行批次中间。
答案 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版本则没有。