Enss数据类型在Cassandra中

时间:2014-05-08 07:15:50

标签: enums cassandra cassandra-2.0

我正在尝试将我的数据库从MySQL迁移到Cassasndra。我面临的问题是其中一个列类型定义为Enum(enum(' GP',' NGP',' PGP',' PAGP& #39))。 Cassandra不支持Enum数据类型(但它支持集合)。有没有办法在Cassandra中实现Enum数据类型,因此应该从一组值中限制列的值?我使用的是Apache Cassandra 2.0.7版。

4 个答案:

答案 0 :(得分:9)

请参阅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

for 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/

答案 1 :(得分:5)

据我所知,在阅读了有关cql类型的文档之后,你不能直接在cql语句中使用enum(我为java客户端检查了这一点)。

因此,您拥有的选项是将Enum转换为String以在cql语句中包含该字段。通过这种方式,所有应用程序都使用Enum,但在后端层使用枚举的字符串表示。

答案 2 :(得分: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>()),
    });

使用C#驱动程序2.5和DSE 4.7。

答案 3 :(得分:2)

在cassandra

中或多或少存在对枚举的本机支持

http://docs.datastax.com/en/developer/java-driver/2.1/java-driver/reference/crudOperations.html

据我所知,你可以为cassandra编写自己的自定义序列化器等,它将能够理解你的特定枚举。但那些罐子应该放在cassandra文件夹中。

您也可以将其存储为String或ordinal int值