Cassandra缓冲了数百万列的读数

时间:2011-04-22 19:44:21

标签: python cassandra pycassa

我有一个少量行(<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_startcolumn_finish指定列名称。这是一个问题,因为我实际上并不知道开始或结束列名称是什么。特殊值""可以指示行的开头或结尾,但这不适用于中间的任何值。

那么如何才能完成单行中所有列的缓冲读取?感谢。

2 个答案:

答案 0 :(得分:4)

来自pycassa 1.0.8 documentation

看起来你可以使用类似下面的[伪代码]:

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.