Удалить записи в таблице Cassandra на основе временного диапазона - PullRequest
2 голосов
/ 22 января 2020

У меня есть таблица Кассандры со схемой:

CREATE TABLE IF NOT EXISTS TestTable(
    documentId text,
    sequenceNo bigint,
    messageData blob,
    clientId text
    PRIMARY KEY(documentId, sequenceNo))
WITH CLUSTERING ORDER BY(sequenceNo DESC);

Есть ли способ удалить записи, которые были вставлены между заданным диапазоном времени? Я знаю, что внутренне Cassandra должна использовать некоторую временную метку для отслеживания времени вставки каждой записи, которая будет использоваться такими функциями, как TTL.

Поскольку в данной схеме нет явного столбца для метки времени вставки, существует ли способ использовать неявную временную метку или есть какой-то лучший подход?

После вставки никогда не будет обновлений записей.

1 Ответ

2 голосов
/ 22 января 2020

Это интересный вопрос ...

Все столбцы, которые не являются частью первичного ключа, имеют так называемый WriteTime, который можно получить с помощью функции writetime(column_name) CQL ( warning : он не работает со столбцами коллекции и возвращает ноль для UDT!). Но поскольку у нас нет вложенных запросов в CQL, вам нужно написать программу для извлечения данных, отфильтровывать записи по WriteTime и удалять записи, где WriteTime старше вашего порога. ( обратите внимание , что значение writetime указывается в микросекундах, а не миллисекундах, как в типе CQL timestamp).

Самый простой способ - использовать API RDD Spark Cassandra Connector , что-то вроде этого:

val timestamp = someDate.toInstant.getEpochSecond * 1000L
val oldData = sc.cassandraTable(srcKeyspace, srcTable)
      .select("prk1", "prk2", "reg_col".writeTime as "writetime")
      .filter(row => row.getLong("writetime") < timestamp)
oldData.deleteFromCassandra(srcKeyspace, srcTable, 
      keyColumns = SomeColumns("prk1", "prk2"))

, где: prk1, prk2, ... - все компоненты первичного ключа (documentId и sequenceNo в вашем случае), и reg_col - любой из «обычных» столбцов таблицы, который не является коллекцией или UDT (например, clientId). Важно, чтобы список столбцов первичного ключа в select и deleteFromCassandra был одинаковым.

...