【问题标题】:Cassandra buffered read of millions of columnsCassandra 缓冲读取数百万列
【发布时间】:2011-08-11 04:33:15
【问题描述】:

我有一个包含少量行(

理想情况下,我想使用 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 指定一个列name。这是一个问题,因为我实际上不知道开始或结束列名是什么。特殊值"" 可以指示行的开始或结束,但这不适用于中间的任何值。

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

【问题讨论】:

  • 哪个版本的 cassandra/pycassa? Hector 0.7.0-28 和 cassandra 0.7+ 让你有列键迭代器,所以这是可能的。
  • 我正在使用 cassandra 0.7 和 pycassa 1.0.7

标签: python cassandra pycassa


【解决方案1】:

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

【讨论】:

  • 嗯,不确定。我需要试一试。
  • 嗯,看来您确实是正确的。我在最终获取过程中遇到了一个问题(由于我无法确定的原因它冻结了),但我通过找出 column_finish 应该是什么来解决这个问题。我奖励你一个互联网。不要把所有的钱都花在一个地方。谢谢!
【解决方案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.

【讨论】:

    猜你喜欢
    • 2016-08-22
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    相关资源
    最近更新 更多