【问题标题】:Pycassa: how to query parts of a Composite TypePycassa:如何查询复合类型的一部分
【发布时间】:2012-03-03 00:22:51
【问题描述】:

基本上我问的是与this question 相同的问题,但对于 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,我应该可以做这样的事情......

谢谢

【问题讨论】:

    标签: cassandra pycassa


    【解决方案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')

    【讨论】:

    • 好的,你在 cf.get() 调用上是对的,它工作正常,我一定是输入了错误。
    • 但是关于我的问题的第二部分,我认为我的例子有点糟糕,因为我真正想要的是如何在 Pycassa 中查询部分复合。显然,在 Hector 和 Pycassa 中,可以使用部分复合执行切片查询,如下所示:cf.get('1234', column_start=('20120216',), column_finish=('20120221',)) 但我当我尝试使用部分复合执行 cf.get() 时出现错误。这在 Cassandra 中是不可能的吗?
    • 部分合成只能用于切片。使用 get 时,您必须知道所需列的完整名称。
    • 好的,非常感谢。因此,一般来说,如果您需要根据复合材料的其中一种子类型过滤掉数据,是您的应用程序代码需要处理它,还是您需要重新组织复合材料组件的顺序?
    • @stantonk 关于切片末端的部分复合,您绝对应该能够做到这一点(在 pycassa 1.4.0 或更高版本中)。你感觉怎么样?
    猜你喜欢
    • 2011-12-24
    • 2020-01-22
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多