Cassandra对百万列的缓冲读取
我有一个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_start
和column_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
看起来你可以使用类似下面的东西 [伪代码]:
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 上还不够熟练,无法在缓冲区中提取列名。