Скопируйте данные из одной таблицы в другую в Кассандре, используя Java
Я пытаюсь переместить все свои данные из одного семейства столбцов (таблицы) в другое. Поскольку обе таблицы имеют разные описания, мне нужно было бы извлечь все данные из таблицы-1 и создать новый объект для таблицы-2, а затем выполнить массовую вставку aync. Моя таблица 1 содержит миллионы записей, поэтому я не могу получить все данные непосредственно в своей структуре данных и разобраться с этим. Я ищу решения, чтобы сделать это легко с помощью Spring Data Cassandra с Java.
Первоначально я планировал сначала переместить все данные во временную таблицу, а затем создать несколько составных отношений ключей и затем запросить мою основную таблицу. Тем не менее, это не кажется мне благоприятным. Кто-нибудь может предложить хорошую стратегию для этого? Любые выводы будут оценены. Спасибо!
2 ответа
Моя таблица 1 содержит миллионы записей, поэтому я не могу получить все данные непосредственно в своей структуре данных и разобраться с этим.
С помощью Java-драйвера datastax вы можете получать все данные по диапазонам токенов и обрабатывать данные из каждого диапазона токенов. Например:
Set<TokenRange> tokenRanges = cassandraSession.getCluster().getMetadata().getTokenRanges();
for(TokenRange tr: tokenRanges) {
List<Row> rows = new ArrayList<>();
for(TokenRange sub: tr.unwrap()){
String query = "SELECT * FROM keyspace.table WHERE token(pk) > ? AND token(pk) <= ?";
SimpleStatement st = new SimpleStatement( query, sub.getStart(), sub.getEnd() );
rows.addAll( session.execute( st ).all() );
}
transformAndWriteToNewTable(rows);
}
Каждый диапазон токенов содержит только часть всех данных и может обрабатываться одной физической машиной. Вы можете обрабатывать каждый диапазон токенов независимо (параллельно или асинхронно), чтобы повысить производительность.
Вы можете использовать Apache Spark Streaming.
Технически вы будете читать данные из первой таблицы, выполнять преобразование "на лету" и записывать во вторую таблицу.
Обратите внимание, я предпочитаю Spark Scala API, так как он имеет более элегантный API, а код потоковых заданий будет более лаконичным. Но если вы хотите сделать это с использованием чистой Java, это ваш выбор.