Как использовать sstableloader с CQL 3.0

Я пытаюсь использовать sstableloader для таблицы, созданной с помощью CQL 3.0. Я создал таблицу в Cassandra с CQL 3 следующим образом:

CREATE TABLE users1 (
  id text PRIMARY KEY,
  firstname text,
  lastname text, 
) WITH
compaction={'class': 'SizeTieredCompactionStrategy'} AND
 compression={'sstable_compression': 'SnappyCompressor'};

Я создаю sstables с помощью SSTableSimpleUnsortedWriter следующим образом:

IPartitioner partitioner = new Murmur3Partitioner();
SSTableSimpleUnsortedWriter usersWriter = new SSTableSimpleUnsortedWriter(  
        directory, partitioner,keyspace,"users1",AsciiType.instance, null,64);
    long timestamp = System.currentTimeMillis() * 1000;
    ByteBuffer id = bytes("a11");
    usersWriter.newRow(id);
    usersWriter.addColumn(bytes("firstname"), bytes("Ticho"), timestamp);
    usersWriter.addColumn(bytes("lastname"), bytes("Richie"), timestamp);
    usersWriter.close();
    System.exit(0);

Хотя sstables сгенерированы, и я успешно загрузил sstables в кластер с 4 узлами в EC2. Но я не могу их запросить. Он просто ждет и в итоге выдает ошибку тайм-аута RPC. Я мог бы сделать это, успешно загрузив и выполнив запрос к колонке, созданной с использованием CLI, как показано в блоге разработчиков Datastax.

Пожалуйста, посоветуйте мне, как правильно использовать SSTableSimpleUnsortedWriter с CQL....

Моя последняя цель - создать семейство столбцов с составными ключами на CQL(репликация таблицы SQL) и загрузить данные с помощью SSTableLoader из очень большого файла экспорта в csv.

2 ответа

Вот результат cli DESCRIBE для вашего cf:

Key Validation Class: org.apache.cassandra.db.marshal.UTF8Type
Default column value validator: org.apache.cassandra.db.marshal.BytesType
Columns sorted by: org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.UTF8Type)

У вас есть как минимум три проблемы:

  • Вы используете AsciiType вместо UTF8Type для валидатора ключа раздела. Вам не нужно ничего делать с вашими вызовами ByteBufferUtil.bytes(String), поскольку они кодируются в UTF8.
  • Имена столбцов в CQL всегда являются составными типами, поэтому (если вы не используете коллекции), вам нужно создавать имена столбцов, используя db.marshal.CompositeType, где последний тип в составном списке - UTF8.
  • Проверьте вывод cli LIST для вашей таблицы, он включает столбец с пустым именем и значением, которое вам нужно добавить, например:

    RowKey: 123 => (столбец =, значение =, отметка времени =1376298826474000) => (столбец = имя, значение =416c6578, отметка времени =1376298826474000) => (столбец = фамилия, значение =4861736c656875727374, отметка времени = 1376298826474000)

Кроме того, вы можете выполнить массовую загрузку в таблицу "статических столбцов", которая обратно совместима со старым форматом семейства столбцов:

CREATE TABLE users1 (
  id text PRIMARY KEY,
  firstname text,
  lastname text, 
) WITH COMPACT STORAGE;

Примеры SSTableLoader должны работать со старым стилем pre-CQL.

Другие вопросы по тегам