3

我有一个带有少量行(< 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""

那么我怎样才能完成对单行中所有列的缓冲读取呢?谢谢。

4

2 回答 2

4

来自pycassa 1.0.8 文档

看来您可以使用类似以下[伪代码]的内容:

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 的熟练程度还不够,无法在缓冲区上迭代以提取列名。

于 2011-04-23T01:55:27.203 回答
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.
于 2013-01-17T14:28:21.243 回答