Cassandra对百万列的缓冲读取

3 投票
2 回答
1395 浏览
提问于 2025-04-16 16:15

我有一个Cassandra集群,里面的行数很少(少于100行),但是每行有大约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 个回答

2

在pycassa的版本1.7.1及以上,你可以使用xget这个功能,来获取一行数据,最多可以有2的63次方减1列。

for col in cf.xget(key, column_count=2**63-1):
    # do something with the column.
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 上还不够熟练,无法在缓冲区中提取列名。

撰写回答