Cassandra复合柱系列

时间:2013-07-11 04:51:49

标签: cassandra cqlsh

我想在sql世界中创建一个简单的要求

CREATE TABLE event_tracking (
  key text,
  trackingid timeuuid,
  entityId bigint,
  entityType text
  userid bigint
  PRIMARY KEY (key, trackingid)
)

我需要一个cli create命令,这是我无法做到的。我需要通过cli创建列族,因为猪无法读取通过cqlsh(duh)创建的列族

这里我尝试过并且没有工作

 create column family event_tracking
...  WITH comparator='CompositeType(TimeUUIDType)'
...  AND key_validation_class=UTF8Type
...  AND default_validation_class = UTF8Type;

1)当我在cqlsh

中看到它时,我不知道它为什么要为它添加值列
CREATE TABLE event_tracking (
  key text,
  trackingid timeuuid,
  value text,
  PRIMARY KEY (key, trackingid)
) WITH COMPACT STORAGE AND
  bloom_filter_fp_chance=0.010000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.000000 AND
  gc_grace_seconds=864000 AND
  read_repair_chance=0.100000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'SnappyCompressor'};

2)我正在使用asynatax来插入行。

OperationResult<CqlResult<Integer, String>> result = keyspace.prepareQuery(CQL3_CF)
    .withCql("INSERT INTO event_tracking (key, column1, value) VALUES ("+System.currentTimeMillis()+","+TimeUUIDUtils.getTimeUUID(System.currentTimeMillis())+",'23232323');").execute();

但是一旦我尝试添加动态列,它就无法识别

OperationResult<CqlResult<Integer, String>> result = keyspace.prepareQuery(CQL3_CF)
.withCql("INSERT INTO event_tracking (key, column1, value, userId, event) VALUES ("+System.currentTimeMillis()+","+TimeUUIDUtils.getTimeUUID(System.currentTimeMillis())+",'23232323', 123455, 'view');").execute(); 

看起来我无法通过cql3

添加动态列

3)如果我尝试通过cql3添加新列

alter table event_tracking add eventid bigint;

它给了我

Bad Request: Cannot add new column to a compact CF

1 个答案:

答案 0 :(得分:1)

0)如果使用COMPACT STORAGE创建表,即使您是从CQL3创建的,Pig也应该可以看到它。但是你需要将entityIdentityType放入主键才能工作(紧凑存储基本上意味着主键中的第一列成为行键,后面成为复合类型)用作列键,然后只有一个列的空间将是值)。

1)以旧方式创建表时,始终会有value,它是列的值,而在CQL3中,表示为,称为{{1 }}。这就是CQL3如何将底层存储模型映射到表。

2)您创建了一个表格,其列的类型为value,因此您只能添加CompositeType(TimeUUIDType)个列。您不能告诉C *将字符串保存为TimeUUID列键。

3)循环回0使用此表:

TimeUUID

这个假设每个CREATE TABLE event_tracking ( key text, trackingid timeuuid, entityId bigint, entityType text, userid bigint, PRIMARY KEY (key, trackingid, entityId, entityType) ) WITH COMPACT STORAGE 只能有一个trackingId / entityId / entityType组合(你的大写不一致,btw?)。这不是你需要进入完整的动态列路由的情况,但是你不能为useridentityId提供不同的数据类型(但在CQL3之前也是如此),有关如何执行动态列的示例,请参阅此问题:Inserting arbitrary columns in Cassandra using CQL3