2012-01-18 42 views
13

Đây là một ví dụ về kịch bản mà tôi đang gặp phải. Nói rằng tôi có gia đình cột này:Truy vấn các cột CompositeType trong Cassandra bằng Hector

create column family CompositeTypeCF 
    with comparator = 'CompositeType(IntegerType,UTF8Type)' 
    and key_validation_class = 'UTF8Type' 
    and default_validation_class = 'UTF8Type' 

Dưới đây là một số mã Java mẫu sử dụng Hector như thế nào tôi sẽ đi về cách chèn một số dữ liệu vào gia đình cột này:

Cluster cluster = HFactory.getOrCreateCluster("Test Cluster", "192.168.1.6:9160"); 
Keyspace keyspaceOperator = HFactory.createKeyspace("CompositeTesting", cluster); 
Composite colKey1 = new Composite(); 
colKey1.addComponent(1, IntegerSerializer.get()); 
colKey1.addComponent("test1", StringSerializer.get()); 
Mutator<String> mutator = HFactory.createMutator(keyspaceOperator, StringSerializer.get()); 
Mutator<String> addInsertion = mutator.addInsertion("rowkey1", "CompositeTypeCF", 
    HFactory.createColumn(colKey1, "Some Data", new CompositeSerializer(), StringSerializer.get())); 
mutator.execute(); 

này hoạt động, và nếu tôi đi đến cassandra-cli và làm một danh sách tôi nhận được điều này:

$ list CompositeTypeCF; 

Using default limit of 100 
------------------- 
RowKey: rowkey1 
=> (column=1:test1, value=Some Data, timestamp=1326916937547000) 

Câu hỏi của tôi bây giờ là: Làm cách nào để truy vấn dữ liệu này trong Hector? Về cơ bản tôi sẽ cần phải truy vấn nó trong một vài cách sau:

  1. Hãy cho tôi toàn bộ hàng nơi Row Key = "rowkey1"
  2. Hãy cho tôi những dữ liệu cột nơi phần đầu của tên cột = một số giá trị số nguyên
  3. Hãy cho tôi tất cả các cột nơi phần đầu của tên cột nằm trong một phạm vi nhất định

Trả lời

13

Tốt khởi điểm hướng dẫn here.

Nhưng, sau khi cuối cùng có nhu cầu sử dụng thành phần hỗn hợp và cố gắng viết truy vấn đối với dữ liệu, tôi đã tìm ra một vài điều mà tôi muốn chia sẻ.

Khi tìm kiếm cột Tổng hợp, kết quả sẽ là một khối cột kề nhau.

Vì vậy, giả sử như hỗn hợp của 3 Strings, và các cột của tôi trông giống như:

A:A:A 
A:B:B 
A:B:C 
A:C:B 
B:A:A 
B:B:A 
B:B:B 
C:A:B 

Để tìm kiếm từ A: A: A đến B: B: B, kết quả sẽ được

A:A:A 
A:B:B 
A:B:C 
A:C:B 
B:A:A 
B:B:A 
B:B:B 

Lưu ý các thành phần "C"? Không có thành phần "C" nào trong điều kiện bắt đầu/kết thúc! đưa cái gì? Đây là tất cả các kết quả giữa các cột A: A: A và B: B: B. Cụm từ tìm kiếm tổng hợp không cho kết quả như xử lý vòng lồng nhau (đây là những gì tôi nghĩ ban đầu), nhưng thay vào đó, vì cột được sắp xếp, bạn chỉ định cụm từ bắt đầu và kết thúc cho khối liền kề cột.

Khi xây dựng các mục tìm kiếm Composite, bạn phải xác định ComponentEquality

Chỉ có hạn cuối cùng nên GREATER_THAN_EQUAL, tất cả những người khác nên EQUAL. ví dụ. cho trên

Composite start = new Composite(); 
start.addComponent(0, "A", Composite.ComponentEquality.EQUAL); 
start.addComponent(1, "A", Composite.ComponentEquality.EQUAL); 
start.addComponent(2, "A", Composite.ComponentEquality.EQUAL); 

Composite end = new Composite(); 
end.addComponent(0, "B", Composite.ComponentEquality.EQUAL); 
end.addComponent(1, "B", Composite.ComponentEquality.EQUAL); 
end.addComponent(2, "B", Composite.ComponentEquality.GREATER_THAN_EQUAL); 

SliceQuery<String, Composite, String> sliceQuery = HFactory.createSliceQuery(keyspace, se, ce, se); 
sliceQuery.setColumnFamily("CF").setKey(myKey); 
ColumnSliceIterator<String, Composite, String> csIterator = new ColumnSliceIterator<String, Composite, String>(sliceQuery, start, end, false); 

while (csIterator.hasNext()) .... 
+1

bạn có thể giải thích tại sao chúng ta cần GREATER_THAN_EQUAL trong thành phần cuối cùng không? Tôi đã đi qua bài báo, nhưng mọi thứ vẫn chưa rõ ràng. –

+0

Tôi đã hỏi câu hỏi này như một câu hỏi riêng biệt để tôi có thể thưởng điểm u! –

+0

Tôi không biết, tôi đã thử nghiệm một số mã mẫu để thuyết phục bản thân rằng nó hoạt động cho những gì tôi cần. – libjack

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