2015-04-22 17 views
13

Tôi mới với cassandra và tôi đã gặp một vấn đề. Tôi đã tạo một bảng phân giải không gian phím và một người dùng bảng. Bảng này có 3 cột: id (int và khóa chính), firstname (varchar), name (varchar). yêu cầu này gửi cho tôi những kết quả tốt:cassandra, chọn qua một tổ chức phi chính chủ chốt

SELECT * FROM demodb.users WHERE id = 3; 

nhưng điều này:

SELECT * FROM demodb.users WHERE firstname = 'francois'; 

không làm việc và tôi nhận được thông báo lỗi sau:

InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on the restricted columns support the provided operators: " 

Yêu cầu này cũng doesn 't work:

SELECT * FROM users WHERE firstname = 'francois' ORDER BY id DESC LIMIT 5; 
InvalidRequest: code=2200 [Invalid query] message="ORDER BY with 2ndary indexes is not supported." 

Cảm ơn trước.

Trả lời

12

Yêu cầu này cũng không hoạt động:

Đó là bởi vì bạn là mis-hiểu cách thứ tự sắp xếp làm việc tại Cassandra. Thay vì sử dụng một chỉ số phổ thông trên firstname, tạo ra một bảng riêng cho truy vấn này, như thế này:

CREATE TABLE usersByFirstName (
    id int, 
    firstname text, 
    lastname text, 
    PRIMARY KEY (firstname,id)); 

Truy vấn này bây giờ sẽ làm việc:

SELECT * FROM usersByFirstName WHERE firstname='francois' 
ORDER BY id DESC LIMIT 5; 

Note, mà tôi đã tạo ra một khóa chính hợp chất trên firstnameid. Điều này sẽ phân chia dữ liệu của bạn trên firstname (cho phép bạn truy vấn dữ liệu), trong khi cũng phân cụm dữ liệu của bạn theo id. Theo mặc định, dữ liệu của bạn sẽ được nhóm theo id theo thứ tự tăng dần. Để thay đổi hành vi này, bạn có thể chỉ định một CLUSTERING ORDER trong bản Tuyên Bố tạo bảng của bạn:

WITH CLUSTERING ORDER BY (id DESC) 

... và sau đó bạn sẽ thậm chí không cần một khoản ORDER BY.

Gần đây tôi đã viết một bài viết về cách để phân nhóm làm việc trong Cassandra (We Shall Have Order). Nó giải thích điều này, và bao gồm một số chiến lược đặt hàng là tốt.

+0

Cảm ơn rất nhiều vì những thông tin đó – mel

5

Có một hạn chế trong cassandra: lĩnh vực nào bạn muốn sử dụng trong mệnh đề where phải là khóa chính của bảng hoặc phải có một chỉ số thứ trên đó. Vì vậy, bạn phải tạo một chỉ mục cho firstname và chỉ sau đó bạn có thể sử dụng firstname trong điều kiện where và bạn sẽ nhận được kết quả mà bạn mong đợi.

+0

cho cả các yêu cầu? – mel

+0

cho id bạn đã đưa ra khóa chính vì vậy không cần cho điều đó. tạo chỉ mục cho tên đầu tiên. –

+1

tôi đã tạo chỉ mục cho firstname và bây giờ: SELECT * FROM demodb.users ĐÂU firstname = 'francois'; công việc nhưng ELECT * FROM người dùng ĐÂU TỰ firstname = 'francois' BY id DESC LIMIT 5; vẫn không hoạt động. – mel

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