0

我在要创建的 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
4

1 回答 1

1

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

1) 当您以旧方式创建表时,总会有一个value,它是列的值,在 CQL3 中表示为名为的value。这就是 CQL3 将底层存储模型映射到表的方式。

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

3)循环回0使用这个表:

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(顺便说一句,您的大小写不一致是怎么回事?)。这不是你需要走完整动态列路线的情况,但是你不能有不同的数据类型和(但在 CQL3 之前也是如此),请参阅这个问题以获取如何做的示例动态列:使用 CQL3 在 Cassandra 中插入任意列entityTypeuseridentityIdentityType

于 2013-07-11T05:29:35.620 回答