Фильтрация по диапазону значений элемента `list <double>` - PullRequest
0 голосов
/ 13 мая 2019

Я бы хотел отфильтровать строки следующей таблицы в cassandra.

CREATE TABLE mids_test_db.defect_data (
    wafer_id text,
    defect_id text,
    document_id text,
    fields list<double>,
    PRIMARY KEY (wafer_id, defect_id)
) 
...
CREATE INDEX defect_data_fields_idx ON mids_test_db.defect_data (values(fields));

То, что я сначала попытался использовать, например, field[0] > 0.5, но не получилось.

cqlsh:mids_test_db> select fields from  defect_data where  wafer_id =  'MIDS_1_20170101_023000_30000_1548100671' and fields[0] > 0.5;
InvalidRequest: Error from server: code=2200 [Invalid query] message="Indexes on list entries (fields[index] = value) are not currently supported."

После поиска в Googleкакое-то время я чувствую, что такую ​​работу нелегко выполнить в Кассандре.Модель данных является чем-то вроде коллекции значений поля.В основном я хочу запросить данные defect, используя данные fields, как указано выше, что очень важно для моего бизнеса.

Какой подход я должен принять во внимание?Фильтрация на стороне приложения?Любой намек или совет будут оценены.

1 Ответ

0 голосов
/ 13 мая 2019

Это невозможно сделать напрямую с Кассандрой, но у вас есть следующие альтернативы:

  • если ваша Cassandra - DataStax Enterprise, вы можете использовать DSE Search ;
  • Вы можете добавить дополнительную таблицу для поиска:

(... игнорировать эту строку ...)

CREATE TABLE mids_test_db.defect_data_lookup (
    wafer_id text,
    defect_id text,
    field double,
    PRIMARY KEY (wafer_id, field, defect_id)
);

после этого вы сможете выполнить сканирование диапазона внутри раздела и, по крайней мере, получить поле defect_id и извлечь все значения поля с помощью второго запроса.

В зависимости от версии Cassandra вы можете использовать материализованное представление для поддержки этой справочной таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...