2013-07-11 2 views
0

У меня есть простое требование в SQL мире я хочу создатьCassandra Композитный Колонка Family

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

Мне нужно кли создать команду, которая я не в состоянии сделать это. Мне нужно создать столбец семью через кли, как свинья не может читать колонки семья создается через cqlsh (ДУХ)

Вот что я пытался и техника его подводит работал

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) Если вы создаете таблицу с помощью COMPACT STORAGE Свинья должна быть в состоянии ее видеть, даже если вы создали ее с CQL3. Но вам нужно будет поставить entityId и entityType в первичный ключ, чтобы это работало (компактное хранилище в основном означает, что первый столбец в первичном ключе становится ключом строки, а следующий становится составным типом, используемым в качестве ключа столбца, а затем есть только место для еще одной колонки, которая будет значением).

1) При создании таблиц старого способа всегда будет value, это значение столбца, а в CQL3, который представлен в виде колонка под названием value. Именно так CQL3 сопоставляет базовую модель хранилища с таблицами.

2) Вы создали таблицу, столбцы которой имеют тип CompositeType(TimeUUIDType), поэтому вы можете добавлять только столбцы, которые являются TimeUUID. Вы не можете указать C * для сохранения строки в качестве ключа столбца TimeUUID.

3) Контурный назад-Используйте эту таблицу:

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 комбинацию для каждого userid (что с вашей непоследовательной капитализацией, кстати)? , Это не тот случай, когда вам нужно пройти полный маршрут динамических столбцов, но тогда у вас не могут быть разные типы данных для entityId и entityType (но это было бы так же, как и до CQL3), см. Этот вопрос для примера того, как для динамических колонок: Inserting arbitrary columns in Cassandra using CQL3

+0

Спасибо Тео. Мое намерение состоит в том, чтобы создать семейство столбцов так долго (System.getCurrentMilliSeconds()), идентификатор отслеживания как uuid и сделать их как составной, а затем добавить сущность, тип сущности, идентификатор пользователя и событие в качестве динамического столбца.Цель состоит в том, что даже если мы получим одновременный запрос в одно и то же время, мы можем записать события в одной строке. Надеюсь, что я получу какой-то смысл. – plzdontkillme

+0

Могу ли я создать CREATE TABLE event_tracking ( key text, trackingid timeuuid – plzdontkillme

Смежные вопросы