我想在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
答案 0 :(得分:1)
0)如果使用COMPACT STORAGE
创建表,即使您是从CQL3创建的,Pig也应该可以看到它。但是你需要将entityId
和entityType
放入主键才能工作(紧凑存储基本上意味着主键中的第一列成为行键,后面成为复合类型)用作列键,然后只有一个列的空间将是值)。
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?)。这不是你需要进入完整的动态列路由的情况,但是你不能为userid
和entityId
提供不同的数据类型(但在CQL3之前也是如此),有关如何执行动态列的示例,请参阅此问题:Inserting arbitrary columns in Cassandra using CQL3