Соединитель Spark Cassandra — предложение where

Я пытаюсь выполнить select where с помощью Datasax Cassandra Connector, но получаю следующую ошибку:

java.io.IOException: Exception during preparation of SELECT "path" FROM "tracking"."user_page_action" WHERE token("user_id") > ? AND token("user_id") <= ? AND user_id = ?   ALLOW FILTERING: user_id cannot be restricted by more than one relation if it includes an Equal

Я действительно не понимаю, почему connector добавляет другие ограничения.

Вот как я пытаюсь читать:

spark.cassandraTable(keySpace,table).select(column).where(whereColumn + " = ?", whereColumnValue).collect()

и это точно так же, как в их документации

user_id - это primary key таблицы, а также я попробовал select where в терминале, используя cqlsh, и это работает.

Я просмотрел похожие вопросы, но они не помогли

Dataframe, где пункт не работает при использовании искрового соединителя cassandra

Соединитель Spark Cassandra – предложение where


person Paul    schedule 03.05.2016    source источник


Ответы (1)


Как вы заметили, spark-cassandra-connector добавил ограничение диапазона токена. Как правило, ваш запрос разбивается соединителем на несколько запросов в соответствии с диапазоном токенов, чтобы каждый запрос выполнялся для реплики, обеспечивая локальность данных. В вашем случае вы предоставляете полный ключ раздела с user_id=value (возможно, Spark не является подходящим инструментом в этом случае, но я не знаю, что делает ваше приложение). Было некоторое обсуждение проекта Spark-Cassandra-Connector, чтобы исправить это, я не знаю, произошло ли это.

Однако, если вы переключитесь на Cassandra 2.2 или 3 (я предполагаю, что вы используете Cassandra 2.1), Cassandra примет сгенерированный запрос (тот, в котором ключ раздела ограничен как равенством, так и диапазоном). Тестировал на 2.2.6 и 3.0.5.

person Christophe Schmitz    schedule 07.05.2016