3

基本上我问的问题与这个问题相同,但对于 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')])

与第一次通话相同。

难道我做错了什么?这应该工作吗?或者是否有一些使用 cf.get(... columns=[('20120216', 'finalscore')]) 的语法?我也试过了,但有例外。

根据http://www.datastax.com/dev/blog/introduction-to-composite-columns-part-1,我应该能够做这样的事情......

谢谢

4

1 回答 1

3

如果知道复合列的所有组件,那么您应该'columns'选择:

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

您说尝试执行此操作时出错,但我建议您再试一次。这对我来说可以。

当您对复合列进行切片时,您需要考虑它们是如何排序的。复合列首先从最左边的组件开始排序,然后将每个组件向右排序。因此,在您的示例中,列将如下所示:

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

('20120216', 'finalscore')因此,当您从to切片时,('20120221', 'finalscore')您会得到'20120216'. 要使您的查询按您的意愿工作,您可以将 column_finish 更改为('20120216', 'halftimescore').

于 2012-03-02T16:22:51.533 回答