2014-05-08 14 views
11

Tôi cố gắng để di chuyển cơ sở dữ liệu của tôi từ MySQL sang Cassasndra. Vấn đề tôi đang phải đối mặt là với một trong những loại cột được định nghĩa là Enum (enum ('GP', 'NGP', 'PGP', 'PagP')). Cassandra không hỗ trợ kiểu dữ liệu Enum (nó hỗ trợ các bộ sưu tập). Có cách nào để thực hiện kiểu dữ liệu Enum trong Cassandra, do đó giá trị của một cột nên được giới hạn từ một tập hợp các giá trị? Tôi đang sử dụng Apache Cassandra phiên bản 2.0.7.Enum kiểu dữ liệu trong Cassandra

+0

Xem thêm [không tìm thấy tài xế Datastax java 3.0.0 được liệt kê chú thích] (http://stackoverflow.com/a/35135223) –

Trả lời

4

Theo tôi biết và sau khi đọc các tài liệu về các loại CQL, bạn không thể sử dụng trực tiếp enum trong báo cáo CQL (tôi kiểm tra này cho các khách hàng java).

Vì vậy, các tùy chọn mà bạn có là chuyển đổi các Enum để String để bao gồm các lĩnh vực trong một tuyên bố CQL. Bằng cách này tất cả các ứng dụng của bạn sử dụng Enum nhưng trong lớp phụ trợ sử dụng biểu diễn chuỗi cho enum.

+0

Yes trong tài liệu hướng dẫn không có kiểu dữ liệu như Enum. Tôi nghĩ rằng tôi cần phải tái tạo hành vi. Nhưng nó là lựa chọn gì nếu tôi định chuyển DB hiện tại của mình từ MySQL sang Cassandra? – Nayan

+0

Tùy chọn? Ý anh là gì? – ftrujillo

+0

Tôi có nghĩa là hiện tại tôi đang sử dụng MySQL hỗ trợ Enum. Nhưng dựa trên các yếu tố kinh doanh nhất định của tôi, tôi có thể di cư đến Cassandra. Trong trường hợp đó, làm thế nào tôi có thể hỗ trợ cột kiểu Enum đó trong Cassandra. Nó có thể là trường hợp mà tôi đang không tương tác với Cassandra qua một khách hàng, có thể tương tác trực tiếp sử dụng CQLSH. Trong trường hợp đó, làm thế nào để sử dụng cột kiểu Enum đó? – Nayan

3

tôi đã phải đối mặt với cùng một vấn đề với một số nguyên enum ... đây là những gì tôi đã làm:

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

Sử dụng C# tài xế 2.5 và DSE 4.7.

2

có nhiều hoặc ít hơn mẹ đẻ ủng hộ của enums trong cassandra

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

Theo như tôi biết bạn có thể viết serializers tùy chỉnh của riêng bạn vv cho cassandra và nó sẽ có thể hiểu enum cụ thể của bạn. Nhưng những cái lọ đó nên ở trong thư mục cassandra.

Bạn cũng có thể lưu nó như String hoặc giá trị int thứ

9

Xem datastax cassandra Object-mapping 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 

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

Các vấn đề liên quan