У меня есть семейство столбцов Cassandra CQL3 со следующей структурой
CREATE TABLE mytable(
A text,
B text,
C text,
mymap map<text,text>,
D text,
PRIMARY KEY (A,B,C)
);
Я пытаюсь вставить в него кучу данных с помощью Astyanax.
Версия Cassandra, с которой я работаю, — 1.2, поэтому я не могу использовать ПАКЕТНУЮ вставку.
Я знаю, что могу запускать команды CQL3 в цикле for, используя подготовленные операторы.
Я хотел знать, можно ли использовать пакет мутаций Astyanax для вставки данных в указанное выше семейство столбцов? Я понимаю, что это будет использовать интерфейс Astyanax Thrift для вставки в семейство столбцов CQL3, но ради производительности записи, является ли это жизнеспособным вариантом?
Я взглянул на структуру семейства столбцов в cassandra-cli, и она выглядит примерно так.
ColumnFamily: mytable
Key Validation Class: org.apache.cassandra.db.marshal.UTF8Type
Default column value validator: org.apache.cassandra.db.marshal.BytesType
Cells sorted by: org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.ColumnToCollectionType(6974656d73:org.apache.cassandra.db.marshal.MapType(org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.UTF8Type)))
Хотя я могу вставлять данные в другие столбцы (т.е. A, B, C, D), создавая POJO с @Component в различных полях, я не уверен, как работать с вставкой карты, т.е. вставлять в mymap столбец.
Образец POJO, который я создал,
public class TestColumn {
@Component(ordinal = 0)
String bComponent;
@Component(ordinal = 1)
String cComponent;
@Component(ordinal = 2)
String columnName;
public TestColumn() {
}
}
Код вставки выглядит следующим образом
AnnotatedCompositeSerializer columnSerializer = new AnnotatedCompositeSerializer(TestColumn.class);
ColumnFamily columnFamily = new ColumnFamily("mytable", StringSerializer.get(), columnSerializer);
final MutationBatch m = keyspace.prepareMutationBatch();
ColumnListMutation columnListMutation = m.withRow(columnFamily, "AVal");
columnListMutation.putColumn(new TestColumn("BVal", "CVal", null), ByteBufferUtil.EMPTY_BYTE_BUFFER,
timeToLive);
columnListMutation.putColumn(new ApiAvColumn("BVal", "CVal", "D"), "DVal",
timeToLive);
m.execute;
Как именно мне изменить приведенный выше код, чтобы я мог также вставить значение карты?