Кассандра буферизовала чтение миллионов столбцов - PullRequest
3 голосов
/ 22 апреля 2011

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 23 апреля 2011

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

2 голосов
/ 17 января 2013

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

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