3

我正在尝试连接到 Cassandra 以进行批量插入。但是,当我尝试连接时,出现错误。

我正在使用的代码:

from pycassa import columnfamily
from pycassa import pool

cassandra_ips = ['<an ip addr>']
conpool = pool.ConnectionPool('my_keyspace', cassandra_ips)

colfam = columnfamily.ColumnFamily(conpool, 'my_table')

然而,这在最后一行失败了:

pycassa.cassandra.ttypes.NotFoundException: NotFoundException(_message=None, why='Column family my_table not found.')

列族肯定存在:

cqlsh> use my_keyspace
   ... ;
cqlsh:my_keyspace> desc tables;

my_table

cqlsh:my_keyspace>

而且我认为这不是表名上的简单错字,因为我已经检查了十几次,但也因为这个:

In [3]: sys_mgr = pycassa.system_manager.SystemManager(cassandra_ips[0])

In [4]: sys_mgr.get_keyspace_column_families('my_keyspace')
Out[4]: {}

为什么会这样{}

如果重要的话:

  • 表/列族是使用 CQL 创建的。
  • 该表目前是空的。
  • 该表大致是使用以下方法创建的:

    CREATE TABLE my_table (
      user_id int,
      year_month int,
      t timestamp,
      <tons of other attributes>
      PRIMARY KEY ((user_id, year_month), t)
    ) WITH compaction =
        { 'class' : 'LeveledCompactionStrategy', 'sstable_size_in_mb' : 160 };
    
4

2 回答 2

0

为了通过 pycassa 等 thrift API 访问 CQL3 数据库,必须使用紧凑存储创建表。

CREATE TABLE my_table (
...
) WITH COMPACT STORAGE;

关于主键,来自文档

使用紧凑存储指令可防止您定义多个不属于复合主键的列。

目前您正在使用复合分区键,但启用紧凑存储会限制我们使用复合分区键。因此,您不必将其限制为单个列,它只需成为复合键的一部分。最后一个参考

于 2014-03-07T22:18:06.817 回答
0

这种情况也可能在创建以大写命名的 CF 后发生: https ://docs.datastax.com/en/cql/3.0/cql/cql_reference/ucase-lcase_r.html

我有这样奇怪的命名空间结构和引用的 CF:

cqlsh:testkeyspace> DESC TABLES;

"Tabletest"  users  "PlayerLastStats"

我在 pycassa 上遇到错误,system_manager.create_column_family(...) 但前提是这里是 column_validation_classes 参数

pycassa.cassandra.ttypes.NotFoundException: NotFoundException(_message=None, why='Column family NewTable not found.')

重命名为小写后,所有表看起来都不错

cqlsh:testkeyspace> DESC TABLES;

tabletest  newtable  users  playerlaststats
于 2016-03-01T12:50:07.880 回答