2011-10-11 31 views
9

Tôi mới dùng cassandra và hector vì vậy tôi đang cố gắng thực thi các truy vấn cql nhưng vấn đề là không phải tất cả các cột đều có kiểu chuỗi như thế nào tôi thực hiện truy vấn "select * from users"?Làm thế nào để sử dụng các truy vấn cql để lấy các kiểu dữ liệu khác nhau ra khỏi cassandra với java client hector

gia đình cột của tôi trông như thế này:

UPDATE COLUMN FAMILY users 
WITH comparator = UTF8Type 
AND key_validation_class=UTF8Type 
AND column_metadata = [ 
{column_name: full_name, validation_class: UTF8Type} 
{column_name: email, validation_class: UTF8Type} 
{column_name: state, validation_class: UTF8Type, index_type: KEYS} 
{column_name: gender, validation_class: UTF8Type} 
{column_name: birth_year, validation_class: LongType, index_type: KEYS} 
{column_name: education, validation_class: UTF8Type} 
]; 

tôi sử dụng đoạn mã sau để thực hiện truy vấn:

CqlQuery<String, String, String> cqlQuery = new CqlQuery<String, String, String>(Keyspace,stringSerializer,stringSerializer,stringSerializer); 

    cqlQuery.setQuery("select * from users"); 

    QueryResult<CqlRows<String, String, String>> result = cqlQuery.execute(); 


    if (result != null && result.get() != null) { 
     List<Row<String, String, String>> list = result.get().getList(); 
     for (Row row : list) { 
      System.out.println("."); 
      List columns = row.getColumnSlice().getColumns(); 
      for (Iterator iterator = columns.iterator(); iterator.hasNext();) { 
       HColumn column = (HColumn) iterator.next(); 
       System.out.print(column.getName() + ":" + column.getValue() 
         + "\t"); 
      } 
      System.out.println(""); 
     } 
    } 

Nhưng vì cột 'birth_year' với lớp xác nhận lâu tôi có thể' t nhận giá trị. tôi nhận được kết quả sau giả định rằng chỉ có một kỷ lục:

KEY:Carl birth_year: 'strange chars?' full_name:Carl Smith gender:M eduction:electrician state:LA 

Nếu tôi thay đổi truy vấn của tôi như thế này:

CqlQuery<String, String, Long> cqlQuery = new CqlQuery<String, String, Long> 
TutorialBase.tutorialKeyspace, stringSerializer, stringSerializer, longSerializer); 

    cqlQuery.setQuery("select birth_year from users"); 

Thân nó hoạt động.

Vậy làm cách nào tôi có thể thực hiện điều này chỉ với một truy vấn và điều gì sẽ xảy ra nếu tôi có nhiều kiểu dữ liệu hơn như boolean và float trong các hàng của một họ cột?

Trả lời

11

Bạn chỉ định loại giá trị là Chuỗi trong CqlRows, vì vậy mọi giá trị được mong đợi là một chuỗi. Bởi vì bạn muốn kết hợp các loại giá trị, bạn nên giữ cho các siêu dữ liệu cột, mà còn chỉ ra lớp xác nhận mặc định như BytesType trong lược đồ và sau đó sử dụng ByteBuffer như kiểu trong CqlRows:

QueryResult<CqlRows<String, String, ByteBuffer>> result = cqlQuery.execute(); 

Sau đó, khi chế biến các giá trị, bạn sẽ phải chuyển đổi sang loại thích hợp, và thay vì lặp qua các cột, có thể bạn sẽ có được cột cụ thể theo tên:

ColumnSlice<String, ByteBuffer> slice = row.getColumnSlice(); 
HColumn<String,ByteBuffer> col = slice.getColumnByName("birth_year"); 
System.out.println(" birth_year: " + col.getValue().getLong()); 

Tất nhiên, Strings phải được xử lý khác nhau, sử dụng java .nio.charset.Charset:

Charset.defaultCharset().decode(col.getValue()).toString() 

Bạn có thể xác định loại từ cột siêu dữ liệu, nhưng tôi chỉ thực hiện điều này thông qua API tiết kiệm (xem ColumnDef), vì vậy không chắc chắn cách thực hiện thông qua API Hector. Nhưng HColumn cung cấp phương thức getValueSerializer(), để có thể bắt đầu.

+0

Hi libjack, cảm ơn phản ứng của bạn. Bạn có nghĩa là chỉ có thể nếu tất cả các cột trong một họ cột có byteBuffer làm lớp xác nhận mặc định? Đó không phải là những gì tôi muốn, bởi vì khi chèn dữ liệu vào cassandra, việc kiểm tra dữ liệu hợp lệ không hoạt động. Nó sẽ có thể chèn một chuỗi trong cột birth_year. Tôi đang thử mã của bạn, nhưng phương thức 'getLong()' không được nhận dạng. – Rubenski

+0

Tôi tìm thấy những gì sai trái: "col.getValue(). GetLong()" Nó phải là "column.getValueBytes(). GetLong()" Câu hỏi trước của tôi được giải quyết. Có thể có nhiều validation_classe trong một họ cột. – Rubenski

+0

Right, getLong() là một phương thức trên ByteBuffer, vì vậy getValue() sẽ chỉ trả về ByteBuffer nếu đó là kiểu được chỉ định cho HColumn: – libjack

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