2014-05-13 21 views
7

Vì vậy, vấn đề ban đầu của tôi là sử dụng hàm token() để trang qua một tập dữ liệu lớn trong Cassandra 1.2.9, như được giải thích và trả lời tại đây: Paging large resultsets in Cassandra with CQL3 with varchar keysKết quả phân trang trong Cassandra với các khóa chính ghép - Thiếu hàng trên

Câu trả lời được chấp nhận có lựa chọn làm việc với mã thông báo và kích cỡ đoạn văn, nhưng một vấn đề khác thể hiện chính nó.

bảng của tôi trông như thế này trong cqlsh:

key   | column1    | value 
---------------+-----------------------+------- 
    85.166.4.140 |  county_finnmark |  4 
    85.166.4.140 |  county_id_20020 |  4 
    85.166.4.140 |  municipality_alta |  2 
    85.166.4.140 | municipality_id_20441 |  2 
93.89.124.241 |  county_hedmark | 24 
93.89.124.241 |  county_id_20005 | 24 

Mấu chốt chính là một hỗn hợp của chính và column1. Trong CLI, cùng một dữ liệu trông như thế này:

get ip['85.166.4.140']; 
=> (counter=county_finnmark, value=4) 
=> (counter=county_id_20020, value=4) 
=> (counter=municipality_alta, value=2) 
=> (counter=municipality_id_20441, value=2) 
Returned 4 results. 

Vấn đề

Khi sử dụng CQL với một giới hạn tức là 100, kết quả trả về có thể dừng ở giữa một kỷ lục, như thế này:

key   | column1    | value 
---------------+-----------------------+------- 
    85.166.4.140 |  county_finnmark |  4 
    85.166.4.140 |  county_id_20020 |  4 

rời này để "hàng" (cột) ra:

85.166.4.140 |  municipality_alta |  2 
    85.166.4.140 | municipality_id_20441 |  2 

Bây giờ, khi tôi sử dụng thẻ() chức năng cho trang tiếp theo như thế nào, hai hàng này đang bị bỏ qua:

select * from ip where token(key) > token('85.166.4.140') limit 10; 

Kết quả:

key   | column1    | value 
---------------+------------------------+------- 
93.89.124.241 |   county_hedmark | 24 
93.89.124.241 |  county_id_20005 | 24 
95.169.53.204 |  county_id_20006 |  2 
95.169.53.204 |   county_oppland |  2 

Vì vậy, không có dấu vết của hai kết quả cuối cùng từ địa chỉ IP trước đó.

Câu hỏi

Làm thế nào tôi có thể sử dụng thẻ() cho phân trang mà không bỏ qua các hàng CQL? Một cái gì đó như:

select * from ip where token(key) > token(key:column1) limit 10; 

Trả lời

5

Ok, vì vậy tôi sử dụng các thông tin trong bài viết này để làm việc ra một giải pháp: http://www.datastax.com/dev/blog/cql3-table-support-in-hadoop-pig-and-hive (phần "CQL3 pagination").

Trước tiên, tôi thực hiện CQL này:

select * from ip limit 5000; 

Từ hàng cuối cùng trong resultset, tôi nhận được chìa khóa (ví dụ: '85 .166.4.140') và giá trị từ column1 (ví dụ: 'county_id_20020').

Sau đó, tôi tạo ra một tuyên bố chuẩn bị đánh giá để

select * from ip where token(key) = token('85.166.4.140') and column1 > 'county_id_20020' ALLOW FILTERING; 

(Tôi đoán nó sẽ làm việc cũng không sử dụng() chức năng thẻ, như việc kiểm tra tại là cho bằng :)

select * from ip where key = '85.166.4.140' and column1 > 'county_id_20020' ALLOW FILTERING; 

Kết quả hiện chứa các hàng X (cột) còn lại cho IP này. Phương thức này sau đó trả về tất cả các hàng và lời gọi tiếp theo đến phương thức bao gồm phím được sử dụng cuối cùng ('85 .166.4.140 ').Với phím này, tôi có thể thực hiện chọn sau:

select * from ip where token(key) > token('85.166.4.140') limit 5000; 

mà mang lại cho tôi 5000 hàng tiếp theo từ (và bao gồm) IP đầu tiên sau '85 .166.4.140' .

Hiện tại, không có cột nào bị mất trong phân trang.

CẬP NHẬT

Cassandra 2.0 giới thiệu phân trang tự động, xử lý bởi các khách hàng. Thông tin thêm ở đây: http://www.datastax.com/dev/blog/client-side-improvements-in-cassandra-2-0

(lưu ý setFetchSize đó là không bắt buộc và không cần thiết cho phân trang để làm việc)

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