2016-10-10 5 views
0

Извините, что название может/не может дать точное описание того, что я намеревался.Cassandra select с диапазоном ключей кластеризации, у которого может не быть первичного ключа

В этом проблема. Мне нужно выбрать данные на основе диапазонов дат, и большинство наших запросов имеют поле «id», которое используется в наших запросах.

Итак, я создал модель данных с идентификатором в качестве первичного ключа и дату как ключ кластеризации.

По существу, как показано ниже (я просто использую поддельные/примерные утверждения, так как я не могу дать фактические данные).

create table tab1(
    id text, 
    col1 text, 
    ... coln text, 
    rec_date date, 
    rec_time timestamp, 
    PRIMARY KEY((id),rec_date,rec_time) 
) WITH CLUSTERING ORDER BY rec_date DESC, rec_time DESC; 

Он работает для большинства запросов и отлично работает.

Однако, я пытался оптимизировать ниже сценарий.

-> Все записи, которые больше, чем дата ABCD-ху-кх

Какой из приведенных ниже подходов было бы хорошо для меня.? Или что-нибудь лучше, чем эти два.

1) очень простой или простой подход. Используйте запрос:

select * from tab1 where id > '0' AND rec_date > 'abcd-xy-kl' 

Каждая запись будет существенно больше, чем «0». Он может по-прежнему выполнять полное сканирование таблицы.

2) Создание вторичного индекса на rec_date и просто использовать запрос:

select * from tab1 where rec_date > 'abcd-xy-kl' 

Кроме того, одна ключевая вещь, это я с помощью искры и с помощью cassandraSqlContext.sql, чтобы получить dataframe.

Итак, учитывая все вышеперечисленные детали, какой подход будет лучше.?

ответ

0

Я не вижу точки фильтрации с идентификатором, как в вашем первом примере. Следующий должны работать и лучше бы подход с моей точки зрения:

select * from tab1 where rec_date > 'abcd-xy-kl' ALLOW FILTERING; 

Обратите внимание, что он не будет работать без ПОЗВОЛЯЕТ ФИЛЬТРАЦИЮ в конце.

0

Вы не можете использовать > 0 для ключа раздела. Кассандра не поддерживается. Обратитесь к documentation за дополнительной информацией об ограничениях в части запросов WHERE.

Чтобы эффективно выполнять запрос ключей кластеризации, вам действительно нужно использовать вторичный индекс. Воздержитесь от использования ALLOW FILTERING, если вы не знаете, что делаете, потому что оно может вызвать «распределенное» сканирование и выполнить очень плохо. Для получения дополнительной информации проверьте documentation.