Cassandra - предложение WHERE с недостатками первичного ключа
Я новичок в cassandra
, и я использую его для задач аналитики (требуется хорошая индексация).
Я прочитал в этом сообщении (и других): cassandra, выберите через не первичный ключ, который я не могу запросить у моей БД с столбцами непервичного ключа с WHERE clause
.
Чтобы сделать это, кажется, что есть 3 возможности (ВСЕ с большими недостатками):
- Создайте вторичный индекс (не рекомендуется для проблем с производительностью).
- Создайте новую таблицу (я не хочу избыточных данных, даже если это нормально с cassandra).
- Поместите столбец, который я хочу запросить, в рамках первичного ключа, и в этом случае мне нужно определить все части первичного ключа в моем предложении WHERE, и я не могу использовать другой оператор, чем
IN
или =
.
Есть ли другой способ сделать то, что я пытаюсь сделать (WHERE clause
с столбцом непервичного ключа), не имея 3 ограничений выше?
Ответы
Ответ 1
Внутри самой Кассандры вы ограничены опциями, которые вы указали выше. Если вы хотите знать, почему посмотрите здесь:
Глубокий взгляд на пункт CQL Where
Однако, если вы пытаетесь запустить аналитику для информации, хранящейся в Cassandra, то вам стоит взглянуть на Spark. Spark создан для крупномасштабной обработки данных в распределенных системах. Фактически, если вы рассматриваете возможность использования Datastax (см. здесь), который имеет некоторые приятные функции интеграции между Spark и Cassandra специально для загрузки и сохранения данных. Имеются как бесплатные (Community), так и платные (Enterprise) издания.
Ответ 2
Я предполагаю, что таблица предназначена для другой цели, учитывая, что поля, которые вы хотите запросить, не являются частью ключа секционирования. Мое предложение состояло в том, чтобы дублировать таблицу и называть ее полями, которые вы хотите запросить. Я бы рекомендовал разработать новую таблицу с конкретной целью, которую вы будете использовать в соответствии с Концепции моделирования данных.
Cassandra предлагает несколько преимуществ, таких как линейное масштабирование и т.д., введя определенные ограничения в отношении того, что вы можете делать с CQL.
Ответ 3
У меня была похожая проблема при использовании версии cassandra 2.x, обновите свою версию до версии cassandra 3.0 и выше. Это было единственное решение для меня.
Ответ 4
Пожалуйста, попробуйте использовать IF
в своем запросе:
UPDATE [keyspace_name.] table_name
[USING TTL time_value | USING TIMESTAMP timestamp_value]
SET assignment [, assignment] . . .
WHERE row_specification
[IF EXISTS | IF condition [AND condition] . . .] ;
см https://docs.datastax.com/en/archived/cql/3.3/cql/cql_reference/cqlUpdate.html