Pycassa: как запрашивать части составного типа

По сути, я задаю то же самое, что и в этом вопросе но для библиотеки Python Cassandra, PyCassa.

Допустим, у вас есть составной тип, хранящий данные следующим образом:

[20120228:finalscore] = '31-17'
[20120228:halftimescore]= '17-17'
[20120221:finalscore] = '3-14'
[20120221:halftimescore]= '3-0'
[20120216:finalscore] = '54-0'
[20120216:halftimescore]= '42-0'

Итак, я знаю, что могу легко нарезать на основе первой части составного типа, выполнив:

>>> cf.get('1234', column_start('20120216',), column_finish('20120221',))
OrderedDict([((u'20120216', u'finalscore'), u'54-0'),
((u'20120216', u'halftimescore'), u'42-0')])

Но если мне нужен только окончательный результат, я бы предположил, что мог бы сделать:

>>> cf.get('1234', column_start('20120216', 'finalscore'),
column_finish('20120221', 'finalscore'))

Получить:

OrderedDict([((u'20120216', u'finalscore'), u'54-0')])

Но вместо этого я получаю:

OrderedDict([((u'20120216', u'finalscore'), u'54-0'),
((u'20120216', u'halftimescore'), u'42-0')])

То же, что и 1-й вызов.

Я делаю что-то неправильно? Должно ли это работать? Или есть какой-то синтаксис, использующий cf.get(... columns=[('20120216', 'finalscore')])? Я тоже пробовал и получил исключение.

Согласно http://www.datastax.com/dev/blog/introduction-to-composite-columns-part-1, я должен сделать что-то вроде этого...

Спасибо


person stantonk    schedule 02.03.2012    source источник


Ответы (1)


Если вы знаете все компоненты составного столбца, вам следует выбрать опцию 'columns':

cf.get('1234', columns=[('20120216', 'finalscore')])

Вы сказали, что при попытке сделать это произошла ошибка, но я предлагаю попробовать еще раз. Он отлично работает для меня.

Когда вы нарезаете составные столбцы, вам нужно подумать о том, как они сортируются. Составные столбцы сортируются, начиная с самого левого компонента, а затем сортируя каждый компонент вправо. Итак, в вашем примере столбцы будут выглядеть так:

+------------+---------------+------------+---------------+------------+----------------+
| 20120216   | 20120216      | 20120221   | 20120221      | 20120228   | 20120228       |
| finalscore | halftimescore | finalscore | halftimescore | finalscore | halftimescore  |
+------------+---------------+------------+---------------+------------+----------------+

Таким образом, когда вы разрезаете от ('20120216', 'finalscore') до ('20120221', 'finalscore'), вы получаете оба значения для '20120216'. Чтобы ваш запрос работал так, как вы хотите, вы можете изменить column_finish на ('20120216', 'halftimescore').

person psanford    schedule 02.03.2012
comment
Итак, вы правы в вызове cf.get(), он работает правильно, я, должно быть, набрал что-то не так. - person stantonk; 02.03.2012
comment
Но что касается второй части моего вопроса, я думаю, что мой пример был немного плохим, потому что я действительно ищу, как запросить частичный композит в Pycassa. Ясно, что и в Hector, и в Pycassa можно выполнить запрос на срез, используя частичный композит, например так: cf.get('1234', column_start=('20120216',), column_finish=('20120221',)) Но я получить сообщение об ошибке, когда я пытаюсь выполнить cf.get() с использованием частичного композита. Разве это невозможно в Кассандре? - person stantonk; 02.03.2012
comment
Частичный композит можно использовать только для нарезки. Когда вы используете get, вы должны знать полные имена нужных вам столбцов. - person psanford; 02.03.2012
comment
Спасибо тебе большое. Так что, как правило, если вам нужно отфильтровать данные на основе одного из подтипов вашего композита, либо ваш код приложения должен позаботиться об этом, либо вам нужно реорганизовать порядок компонентов вашего композита? - person stantonk; 02.03.2012
comment
@stantonk относительно частичных композитов для концов фрагментов, вы определенно сможете это сделать (в pycassa 1.4.0 или более поздней версии). Как он ломается у вас? - person Tyler Hobbs; 05.03.2012
comment
Это работает, я неправильно понял, что было возможно с нарезкой на частичных композитах в результате примера с datastax. - person stantonk; 05.03.2012