我有一个少量行(<100)的cassandra集群。每行有大约200万列。我需要得到一个完整的行(所有200万列),但是在我完成阅读之前,事情开始失败。我想做一些缓冲读取。
理想情况下,我想使用Pycassa做这样的事情(不是这不是调用get
的正确方法,它只是让你可以得到这个想法):
results = {}
start = 0
while True:
# Fetch blocks of size 500
buffer = column_family.get(key, column_offset=start, column_count=500)
if len(buffer) == 0:
break
# Merge these results into the main one
results.update(buffer)
# Update the offset
start += len(buffer)
Pycassa(以及扩展Cassandra)不允许你这样做。相反,您需要为column_start
和column_finish
指定列名称。这是一个问题,因为我实际上并不知道开始或结束列名称是什么。特殊值""
可以指示行的开头或结尾,但这不适用于中间的任何值。
那么如何才能完成单行中所有列的缓冲读取?感谢。
答案 0 :(得分:4)
看起来你可以使用类似下面的[伪代码]:
results = {}
start = 0
startColumn = ""
while True:
# Fetch blocks of size 500
buffer = get(key, column_start=startColumn, column_finish="", column_count=100)
# iterate returned values.
# set startColumn == previous column_finish.
请记住,在每次后续调用中,您只返回99个结果,因为它还返回了您已经看过的startColumn。我在Python方面还不够熟练,无法迭代缓冲区来提取列名。
答案 1 :(得分:2)
在pycassa的v1.7.1 +中,你可以使用xget并获得一行宽到2 ** 63-1列。
for col in cf.xget(key, column_count=2**63-1):
# do something with the column.