Материализованный вид Cassandra не позволяет мне фильтровать

#cassandra

#кассандра

Вопрос:

Я создал материализованный вид:

СОЗДАЙТЕ МАТЕРИАЛИЗОВАННЫЙ ВИД test_view КАК SELECT state, city, zip, loc, pop ИЗ citylist, ГДЕ состояние НЕ РАВНО НУЛЮ, А город НЕ Равен НУЛЮ, А zip НЕ Равен НУЛЮ, А pop НЕ РАВЕН НУЛЮ
ПЕРВИЧНЫЙ КЛЮЧ (state, city, pop, zip) С ПОРЯДКОМ КЛАСТЕРИЗАЦИИ ПО (состояние ASC).

и я получаю результаты запроса «SELECT * FROM test_view Where state=’NY’LIMIT 15;» как:

 state | city         | pop   | zip   | loc
------- -------------- ------- ------- -------------------------
    NY |       ACCORD |  2695 | 12404 | [-74.235336, 41.808308]
    NY |         ACRA |   525 | 12405 | [-74.085723, 42.330367]
    NY |  ADAMS BASIN |   989 | 14410 | [-77.853905, 43.190644]
    NY | ADAMS CENTER |  2649 | 13606 |  [-76.00415, 43.863106]
    NY |      ADDISON |  4967 | 14801 |  [-77.266027, 42.09825]
    NY |   ADIRONDACK |   105 | 12808 | [-73.782486, 43.716479]
    NY |        AFTON |  2801 | 13730 | [-75.536604, 42.241737]
    NY |        AKRON |  7924 | 14001 | [-78.508365, 43.024944]
    NY |      ALABAMA |    68 | 14003 | [-78.385231, 43.071888]
    NY |       ALBANY |  2709 | 12207 | [-73.752327, 42.658133]
    NY |       ALBANY |  6927 | 12204 | [-73.735364, 42.684667]
    NY |       ALBANY |  9374 | 12210 |   [-73.76052, 42.65677]
    NY |       ALBANY | 10008 | 12209 | [-73.785385, 42.641665]
    NY |       ALBANY | 11097 | 12202 | [-73.764071, 42.641314]
    NY |       ALBANY | 17230 | 12206 | [-73.774406, 42.668326]
 

Теперь, когда я добавляю еще одно условие фильтрации для выполнения запроса:

ВЫБЕРИТЕ * ИЗ test_view, где state = ‘NY’ И pop> 2000 ПОРЯДОК ПО городу ОГРАНИЧЕНИЕ ПО ВОЗРАСТАНИЮ 15;

Я получаю сообщение об ошибке:

InvalidRequest: ошибка с сервера: code = 2200 [Неверный запрос] сообщение =»Столбец ПЕРВИЧНОГО КЛЮЧА «pop» не может быть ограничен, поскольку предыдущий столбец «город» не ограничен»

Я хочу иметь возможность сохранять порядок записей в таблице / результатах выше, но также разрешать фильтрацию с использованием «pop». Как я буду редактировать свой оператор materialized view для этого?

Ответ №1:

 CREATE MATERIALIZED VIEW test_view AS SELECT state, city, zip, loc, pop FROM citylist WHERE state IS NOT NULL AND city IS NOT NULL AND zip IS NOT NULL AND pop IS NOT NULL
PRIMARY KEY (state,pop,city,zip) WITH CLUSTERING ORDER BY (state ASC).
 

Порядок, в котором создаются ключи, имеет значение — вы не можете ограничить с помощью столбца, не ограничивая предыдущий столбец в списке составных ключей (без разрешения фильтрации и что в любом случае не является хорошей идеей)

Ответ №2:

Если вы не собираетесь запрашивать, используя как штат, так и город, вы можете изменить свой вид на тот, который показан ниже.

СОЗДАЙТЕ МАТЕРИАЛИЗОВАННЫЙ ВИД test_view КАК ВЫБЕРИТЕ состояние, город, почтовый индекс, местоположение, pop ИЗ списка городов, ГДЕ состояние НЕ РАВНО НУЛЮ, А город НЕ Равен НУЛЮ, А zip НЕ Равен НУЛЮ, А pop НЕ РАВЕН НУЛЮ ПЕРВИЧНЫЙ КЛЮЧ (состояние, pop, город, почтовый индекс) С ПОРЯДКОМ КЛАСТЕРИЗАЦИИ ПО (pop ASC, city ASC)

Затем вы можете запросить следующим образом ВЫБЕРИТЕ * ИЗ test_view, где state = ‘NY’ И pop> 2000 ПОРЯДОК ПО pop, ограничение ПО ВОЗРАСТАНИЮ города 15;

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

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