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