【问题标题】:Pycassa and Cassandra: doing a select based on columns onlyPycassa 和 Cassandra:仅基于列进行选择
【发布时间】:2013-09-09 16:40:43
【问题描述】:

我对这两种技术都很陌生,我正在尝试做以下事情:

  • select * from mytable where column = "col1" or column="col2"

到目前为止,文档说我应该通过以下方式使用 get 方法:

 family.get('rowid')

但我没有行 ID。我将如何运行上述查询?

谢谢

【问题讨论】:

    标签: cassandra pycassa


    【解决方案1】:

    总的来说,我认为您将两种想法混为一谈。您编写的查询是用 CQL 编写的,而 Pycassa 不支持 CQL(至少据我所知)。

    但是,一般不管使用什么查询接口,如果不知道行键,就必须在查询列上创建Secondary Indexes

    您可以在 Pycassa 中做到这一点,请考虑以下代码片段:

    from pycassa.columnfamily import ColumnFamily
    from pycassa.pool import ConnectionPool
    from pycassa.index import *
    from pycassa.system_manager import *
    
    sys = SystemManager('192.168.56.110:9160')
    
    try:
            sys.drop_keyspace('TestKeySpace')
    except:
            pass
    
    sys.create_keyspace('TestKeySpace', SIMPLE_STRATEGY, {'replication_factor': '1'})
    sys.create_column_family('TestKeySpace', 'mycolumnfamily')
    
    sys.alter_column('TestKeySpace', 'mycolumnfamily', 'column1', LONG_TYPE)
    sys.alter_column('TestKeySpace', 'mycolumnfamily', 'column2', LONG_TYPE)
    
    sys.create_index('TestKeySpace', 'mycolumnfamily', 'column1', value_type=LONG_TYPE, index_name='column1_index')
    sys.create_index('TestKeySpace', 'mycolumnfamily', 'column2', value_type=LONG_TYPE, index_name='column2_index')
    
    pool = ConnectionPool('TestKeySpace')
    col_fam = ColumnFamily(pool, 'mycolumnfamily')
    
    col_fam.insert('row_key0', {'column1': 10, 'column2': 20})
    col_fam.insert('row_key1', {'column1': 20, 'column2': 20})
    col_fam.insert('row_key2', {'column1': 30, 'column2': 20})
    col_fam.insert('row_key3', {'column1': 10, 'column2': 20})
    
    # OrderedDict([('column1', 10), ('column2', 20)])
    print col_fam.get('row_key0')
    
    ## Find using index: http://pycassa.github.io/pycassa/api/pycassa/
    column1_expr = create_index_expression('column1', 10)
    column2_expr = create_index_expression('column2', 20)
    
    clause = create_index_clause([column1_expr, column2_expr], count=20)
    
    for key, columns in col_fam.get_indexed_slices(clause):
            print "Key => %s, column1 = %d, column2 = %d" % (key, columns['column1'], columns['column2'])
    
    sys.close
    

    但是,也许您可​​以考虑是否可以以一种可以使用行键查询数据的方式设计您的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-22
      • 2017-04-16
      • 2014-04-11
      • 1970-01-01
      • 2018-07-20
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多