2014-05-08 14 views
11

Sto provando a migrare il mio database da MySQL a Cassasndra. Il problema che sto affrontando è con uno dei tipi di colonna definiti come Enum ('GP', 'NGP', 'PGP', 'PAGP')). Cassandra non supporta i tipi di dati Enum (tuttavia supporta le raccolte). C'è un modo per implementare il tipo di dati Enum in Cassandra, in modo che il valore di una colonna debba essere limitato da un insieme di valori? Sto usando Apache Cassandra versione 2.0.7.Tipo di dati Enum in Cassandra

+0

Vedere anche [Datastax java driver 3.0.0 Annotazione enumerata non trovata] (http://stackoverflow.com/a/35135223) –

risposta

4

Per quanto ne so e dopo aver letto la documentazione sui tipi di cql, non è possibile utilizzare direttamente enum nelle istruzioni cql (lo controllo per i client java).

Quindi l'opzione che si ha è convertire l'Enum in stringa per includere il campo in un'istruzione cql. In questo modo, tutte le applicazioni utilizzano l'Enum, ma nel livello di back-end usano la rappresentazione delle stringhe per l'enum.

+0

Sì, nella documentazione non esiste alcun tipo di dati come Enum. Penso di aver bisogno di replicare il comportamento. Ma quale sarebbe l'opzione se ho intenzione di spostare il mio attuale DB da MySQL a Cassandra? – Nayan

+0

Opzioni? Cosa intendi? – ftrujillo

+0

Intendo dire che attualmente sto usando MySQL che supporta Enum. Ma sulla base dei miei determinati fattori di business, potrei migrare a Cassandra. In tal caso, come posso supportare la colonna di tipo Enum nel Cassandra. Può darsi che io non stia interagendo con Cassandra tramite un client, possa interagire direttamente usando CQLSH. In tal caso, come utilizzare la colonna di tipo Enum? – Nayan

3

stavo affrontando lo stesso problema con un enum intero ... ecco quello che ho fatto:

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>()), 
    }); 

con C# 2.5 e driver di DSE 4.7.

9

Vedi datastax cassandra Object-mappatura 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 

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