我正在尝试连接到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]: {}
为什么是{}
?
如果重要:
该表大致使用以下方式创建:
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 };
答案 0 :(得分:0)
为了通过thrift API(例如pycassa)访问CQL3数据库,必须使用紧凑型存储创建表。
CREATE TABLE my_table (
...
) WITH COMPACT STORAGE;
关于主键,来自docs:
使用紧凑型存储指令可以防止您定义更多内容 不是一列不是复合主键的一部分。
目前您使用的是composite partition key,但启用紧凑型存储限制了我们使用复合分区键。因此,不必须将其限制为单个列,它只需要是复合键的一部分。最后一个reference。
答案 1 :(得分: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