Cassandra буферизует чтение миллионов столбцов

У меня есть кластер cassandra с небольшим количеством строк (‹ 100). Каждая строка имеет около 2 миллионов столбцов. Мне нужно получить полную строку (все 2 миллиона столбцов), но все начинает давать сбои, прежде чем я смогу закончить чтение. Я хотел бы сделать какое-то буферизованное чтение.

В идеале я хотел бы сделать что-то подобное, используя 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)

Пикасса (и соответственно Кассандра) не позволяет вам этого делать. Вместо этого вам нужно указать столбец имя для column_start и column_finish. Это проблема, поскольку я на самом деле не знаю, какими будут имена начального или конечного столбца. Специальное значение "" может указывать на начало или конец строки, но это не работает ни для одного из значений в середине.

Итак, как я могу выполнить буферизованное чтение всех столбцов в одной строке? Спасибо.


person Chris Eberle    schedule 22.04.2011    source источник
comment
какая версия кассандры/пикассы? Hector 0.7.0-28 и cassandra 0.7+ позволяют использовать итераторы ключей столбцов, так что это возможно.   -  person Chris K    schedule 23.04.2011
comment
Я использую cassandra 0.7 и pycassa 1.0.7.   -  person Chris Eberle    schedule 23.04.2011


Ответы (2)


Из документации по 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, чтобы перебирать буфер для извлечения имен столбцов.

person Chris K    schedule 23.04.2011
comment
Хм, не уверен. Мне нужно попробовать. - person Chris Eberle; 23.04.2011
comment
Что ж, похоже, вы действительно правы. У меня была проблема во время окончательного получения (она зависла по причинам, которые я не могу определить), но я решил ее, выяснив, что column_finish должно было быть впереди. Я награждаю вас одним интернетом. Не тратьте все на одно место. Спасибо! - person Chris Eberle; 23.04.2011

В v1.7.1+ pycassa вы можете использовать xget и получить строку шириной до 2 ** 63-1 столбцов.

for col in cf.xget(key, column_count=2**63-1):
    # do something with the column.
person user1987428    schedule 17.01.2013