Использование ttl () cassandra в предложении where - PullRequest
1 голос
/ 10 июля 2020

Я хотел бы спросить, можно ли получить строки из cassandra, у которых ttl (время жизни) больше 0. Итак, на следующем шаге я могу обновить эти строки с помощью ttl 0. В основном цель состоит в том, чтобы изменить ttl всех столбцов для каждой записи в db равняется 0.

Я пробовал SELECT * FROM table where ttl(column1) > 0, но кажется, что невозможно использовать функцию ttl () в предложении where.

Я также нашел способ, которым мы можем экспортировать все строки в csv, удалить данные в нашей таблице и снова импортировать их из csv с новым ttl. Это работает, но опасно, потому что у нас более миллиона записей в продакшене, и мы не знаем, как это будет вести себя.

1 Ответ

0 голосов
/ 10 июля 2020

Вы не можете сделать это только с CQL - вам нужна поддержка какого-либо инструмента, например:

  • DSBulk - вы можете выгрузить все ваши данные в CSV файл и загрузите обратно с новым набором TTL (если вы установите его на 0, просто загрузите данные обратно). Вот сообщение в блоге , в котором показано, как использовать DSBulk с TTL . Но у вас не может быть условия на TTL, поэтому вам нужно выгрузить все свои данные
  • Spark с помощью Spark Cassandra Connector (даже в режиме локального мастера). Версия 2.5.0 поддерживает TTL в Dataframe API (более ранние версии поддерживали его только для RDD API) - для Spark 2.4 вам необходимо правильно зарегистрировать функции . Это можно сделать один раз, непосредственно в spark-shell с чем-то вроде этого (вам нужно настроить столбцы в операторах select и filter):
import org.apache.spark.sql.cassandra._
val data = spark.read.cassandraFormat("table", "keyspace").load
val ttlData = data.select(ttl("col1").as("col_ttl"), $"col2", $"col3").filter($"col_ttl" > 0)
ttlData.drop("col_ttl").write.cassandraFormat("table", "keyspace").mode("append").save
...