2015-04-09 3 views
1

У меня такой стол.Моделирование временных рядов Кассандры

> CREATE TABLE docyard.documents (
>  document_id text, 
>  namespace text, 
>  version_id text, 
>  created_at timestamp, 
>  path text, 
>  attributes map<text, text> 
>  PRIMARY KEY (document_id, namespace, version_id, created_at)) WITH CLUSTERING ORDER BY (namespace ASC, version_id ASC, created_at 
> ASC) 
>  AND bloom_filter_fp_chance = 0.01 
>  AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}' 
>  AND comment = '' 
>  AND compaction = {'min_threshold': '4', 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 
> 'max_threshold': '32'} 
>  AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'} 
>  AND dclocal_read_repair_chance = 0.1 
>  AND default_time_to_live = 0 
>  AND gc_grace_seconds = 864000 
>  AND max_index_interval = 2048 
>  AND memtable_flush_period_in_ms = 0 
>  AND min_index_interval = 128 
>  AND read_repair_chance = 0.0 
>  AND speculative_retry = '99.0PERCENTILE'; 

Я хочу, чтобы иметь возможность делать интервальные запросы на следующие условия-

select * from documents where namespace = 'something' and created_at> 'some-value' order by created_at allow filtering; 

select from documents where namespace = 'something' and path = 'something' and created_at> 'some-value' order by created_at allow filtering; 

Я не в состоянии сделать эти запросы работать каким-либо образом. Пробовали и вторичные индексы. Кто-нибудь может помочь?

Я продолжаю получать то или другое, пытаясь заставить его работать.

+0

У вас возникли какие-либо ошибки? что-то еще? – raam86

+0

Я попытался скопировать таблицу, используя поле created_at, как это. PRIMARY KEY ((document_id, namespace, version_id), created_at) С КЛАСТЕРИРОВАНИЕМ ORDER BY (created_at ASC). –

+0

И я попытался запустить этот запрос и получил сообщение об ошибке as - select created_at из документов, где namespace = 'ola-test' order by created_at; code = 2200 [Invalid query] message = "Разделение пространства имен" не может быть ограничено, поскольку предыдущий столбец ("ColumnDefinition {name = document_id, type = org.apache.cassandra.db.marshal.UTF8Type, kind = PARTITION_KEY, componentIndex = 0, indexName = null, indexType = null} ") либо не ограничено, либо ограничено отношением, отличным от EQ" –

ответ

3

Прежде всего, не используйте вторичные индексы или ALLOW FILTERING. С временными данными, которые со временем будут работать ужасно.

Чтобы удовлетворить свой первый запрос, вы хотите, чтобы перестроить вашу PRIMARY KEY и порядкового группирования, как это:

PRIMARY KEY (namespace, created_at, document_id)) 
WITH CLUSTERING ORDER BY (created_at DESC, document_id ASC); 

Это позволит следующее:

  • Разметка по namespace.
  • Сортировка по created_at в DESCending order (самые последние строки читают в первую очередь).
  • единственность по document_id
  • Вам не нужно будет ALLOW FILTERING или ORDER BY в запросе, так как будут предоставлены необходимые ключи, а результаты уже будут отсортированы по вашей КЛАСТЕРИЗАЦИИ ПОРЯДКЕ.

Для вашего второго запроса я бы создал дополнительную таблицу запросов. Это связано с тем, что в Cassandra вам нужно смоделировать таблицы в соответствии с вашими запросами. Вы можете получить несколько таблиц запросов для тех же данных, и это нормально.

CREATE TABLE docyardbypath.documents (
    document_id text, 
    namespace text, 
    version_id text, 
    created_at timestamp, 
    path text, 
    attributes map<text, text> 
PRIMARY KEY ((namespace, path), created_at, document_id)) 
    WITH CLUSTERING ORDER BY (created_at DESC, document_id ASC); 

Это будет:

  • Partition обоими namespace и path.
  • Разрешать строки в уникальных комбинациях namespace и path для сортировки в соответствии с вашим КЛАСТЕРНЫМ ЗАКАЗОМ.
  • Опять же, вам не нужно ALLOW FILTERING или ORDER BY в вашем запросе.
+0

Thanx .. После большого поиска и анализа я думаю, что нам нужно получить таблицы запросов вместо повторного моделирования существующего класса, так как это может повлиять на другие запросы, которые уже используются , Thanx для предоставления табличных структур. Маркировка как ответ, приветствия .. –

+0

@bryce Это отличный ответ. –

1

Я думаю, вам нужно посмотреть, как работает моделирование данных в Кассандре.

Первый запрос может выглядеть следующим образом:

select * from documents where namespace = 'something' and created_at > 'some_formatted_date' and document_id='someid' and version_id='some_version' order by namespace, version_id, created_at allow filtering; 

При запросе таблицы Кассандру, вы должны:

  1. Обеспечить все элементы первичного ключа во время select
  2. Order by следуя порядок кластеризации

Исправление второго запроса является простым. Что ты пытаешься сделать? Cassandra оптимизирована для производительности записи. Вы можете записать эти данные в несколько таблиц для каждой группы запросов, которые вы планируете запускать.

+0

Привет, моим требованием было перечислить все документы под одним пространством имен и под папкой на основе созданного времени. Как я упоминал в ответе @ BryceAtNetwork23, таблицы запросов - это способ продвижения вперед. Спасибо за всю помощь ... –

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