Я пытаюсь перенести мою базу данных из MySQL в Cassasndra. Проблема, с которой я столкнулся, - это один из типов столбцов, определенных как Enum (перечисление ( "GP", "NGP", "PGP", "PAGP" )). Cassandra не поддерживает типы данных Enum (хотя он поддерживает коллекции). Есть ли способ реализовать тип данных Enum в Cassandra, так что значение столбца должно быть ограничено набором значений? Я использую Apache Cassandra версии 2.0.7.
Тип данных Enum в Кассандре
Ответ 1
См. datastax cassandra API сопоставления объектов,
http://docs.datastax.com/en/developer/java-driver/2.1/java-driver/reference/crudOperations.html
enum Gender { FEMALE, MALE };
// FEMALE will be persisted as 'FEMALE'
@Enumerated(EnumType.STRING)
private Gender gender;
// FEMALE will be persisted as 0, MALE as 1
@Enumerated(EnumType.ORDINAL)
private Gender gender
для cassandra 3.0
enum State {INIT, RUNNING, STOPPING, STOPPED}
cluster.getConfiguration().getCodecRegistry()
.register(new EnumNameCodec<State>(State.class));
// schema: create table name_example(id int PRIMARY KEY, state text)
session.execute("insert into name_example (id, state) values (1, ?)", State.INIT);
// state is saved as 'INIT'
http://docs.datastax.com/en/developer/java-driver/3.1/manual/custom_codecs/extras/
Ответ 2
Насколько я знаю и прочитав документацию о типах cql, вы не можете использовать непосредственно enum в операторах cql (я проверяю это для java-клиентов).
Таким образом, у вас есть вариант преобразования Enum to String для включения поля в оператор cql. Таким образом, все ваше приложение использует Enum, но в backend-слое используется строковое представление для перечисления.
Ответ 3
Я столкнулся с той же проблемой с целым перечислением... вот что я сделал:
MappingConfiguration.Global.Define(
new[] {
new Map<Login>()
.TableName("logins")
.PartitionKey(el => el.UserId)
.Column(el => el.UserId, cm => cm.WithName("user_id")),
.Column(el => el.Gender, cm => cm.WithName("gender_id").WithDbType<int>()),
});
Использование С# драйвера 2.5 и DSE 4.7.
Ответ 4
существует более или менее нативная поддержка перечислений в cassandra
http://docs.datastax.com/en/developer/java-driver/2.1/java-driver/reference/crudOperations.html
Насколько я знаю, вы можете написать свои собственные сериализаторы и т.д. для cassandra, и он сможет понять ваше конкретное перечисление. Но эти банки должны быть в папке cassandra.
Вы также можете сохранить его как String или порядковое значение int