2016-02-17 18 views
6

Tôi muốn lấy hàng được chèn vào cuối cùng trong bảng Cassandra. Làm thế nào để có được nó? Bất kỳ ý tưởng?Làm thế nào để có được hàng chèn cuối cùng trong Cassandra?

Tôi đang phát triển một dự án cho rằng tôi đang thay thế mysql bằng cassandra. Tôi muốn thoát khỏi tất cả các truy vấn sql và viết tất cả trong cassandra.

+0

Trong bất kỳ môi trường nhóm nào, hầu như không thể xác định mục nhập được chèn lần cuối. Cassandra cũng không ngoại lệ. –

+0

Đối với người Cassandra: khái niệm "hàng chèn cuối cùng" trong MySQL thực sự là id (tự động) của hàng được chèn bởi khách hàng của bạn thông qua một câu lệnh INSERT. Đây là một vấn đề thực sự trong Cassandra nếu, ví dụ, khóa chính của bạn là một 'timeuuid' và bạn sử dụng hàm' now() 'để tự động tạo ra giá trị cho hàng mới. Có vẻ như không có cách nào để xác định timeuuid của hàng mới mặc dù điều đó có vẻ giống như một điều dễ dàng để thêm vào trình điều khiển. – Shannon

Trả lời

2

Tôi muốn nhận hàng được chèn cuối cùng trong bảng Cassandra. Làm thế nào để có được nó? Bất kỳ ý tưởng?

Nó không phải là có thể, những gì bạn yêu cầu là một mô hình hàng đợi (cho tôi tin nhắn cuối cùng trong) và hàng đợi là một tiếng chống mẫu cho Cassandra

8

Chỉ cần để truyền đạt một sự hiểu biết rất ít. ..

Như với tất cả các vấn đề truy vấn Cassandra, truy vấn cần phải được phục vụ theo mô hình được thiết kế đặc biệt cho nó. Điều này được gọi là mô hình dựa trên truy vấn. Truy vấn hàng được chèn cuối cùng không phải là khả năng nội tại được tích hợp vào mỗi bảng. Bạn sẽ cần phải thiết kế mô hình của bạn để hỗ trợ trước thời hạn.

Ví dụ: giả sử tôi có bảng lưu trữ dữ liệu cho người dùng.

CREATE TABLE users (
    username TEXT, 
    email TEXT, 
    firstname TEXT, 
    lastname TEXT, 
    PRIMARY KEY (username)); 

Nếu tôi chạy SELECT * FROM users LIMIT 1 trên bảng này, tập hợp kết quả của tôi sẽ chứa một hàng. Hàng đó sẽ là hàng có giá trị băm thấp nhất là username (khóa phân vùng của tôi), vì đó là cách Cassandra lưu trữ dữ liệu trong cụm. Tôi sẽ không có cách nào để biết nếu nó là người cuối cùng được thêm vào hay không, do đó, điều này sẽ không được terribly hữu ích cho bạn.

Mặt khác, giả sử tôi có một bảng được thiết kế để theo dõi các cập nhật mà người dùng đã thực hiện cho thông tin tài khoản của họ.

CREATE TABLE userUpdates (
    username TEXT, 
    lastUpdated TIMEUUID, 
    email TEXT, 
    firstname TEXT, 
    lastname TEXT, 
    PRIMARY KEY (username,lastUpdated)) 
WITH CLUSTERING ORDER BY (lastUpdated DESC); 

Tiếp theo tôi sẽ upsert 3 hàng:

> INSERT INTO userUpdates (username,lastUpdated,email,firstname,lastname) 
    VALUES ('bkerman',now(),'[email protected]','Bob','Kerman'); 
> INSERT INTO userUpdates (username,lastUpdated,email,firstname,lastname) 
    VALUES ('jkerman',now(),'[email protected]','Jebediah','Kerman'); 
> INSERT INTO userUpdates (username,lastUpdated,email,firstname,lastname) 
    VALUES ('bkerman',now(),'[email protected]','Bob','Kerman'); 

> SELECT username, email, dateof(lastUpdated) FROM userupdates; 

username | email    | system.dateof(lastupdated) 
----------+-------------------+---------------------------- 
    jkerman | [email protected] | 2016-02-17 15:31:39+0000 
    bkerman | [email protected] | 2016-02-17 15:32:22+0000 
    bkerman | [email protected] | 2016-02-17 15:31:38+0000 

(3 rows) 

Nếu tôi chỉ SELECT username, email, dateof(lastUpdated) FROM userupdates LIMIT 1 tôi sẽ nhận được dữ liệu Jedediah Kerman, mà không phải là gần đây nhất được cập nhật. Tuy nhiên, nếu tôi giới hạn phân vùng của tôi thành username='bkerman', với LIMIT 1 tôi sẽ nhận được hàng gần đây nhất cho Bob Kerman.

> SELECT username, email, dateof(lastUpdated) FROM userupdates WHERE username='bkerman' LIMIT 1; 

username | email    | system.dateof(lastupdated) 
----------+-------------------+---------------------------- 
    bkerman | [email protected] | 2016-02-17 15:32:22+0000 

(1 rows) 

này hoạt động, bởi vì tôi đã chỉ định một trật tự clustering của giảm dần trên lastUpdated:

WITH CLUSTERING ORDER BY (lastUpdated DESC); 

Bằng cách này, kết quả trong mỗi phân vùng sẽ được trả lại với hàng gần đây nhất upserted tại trên cùng, do đó LIMIT 1 trở thành cách để truy vấn hàng gần đây nhất.

Tóm lại, điều quan trọng là phải hiểu rằng:

  • Cassandra đơn đặt hàng dữ liệu trong cụm bởi giá trị băm của một chìa khóa phân vùng. Điều này giúp đảm bảo phân phối dữ liệu thậm chí nhiều hơn.
  • Cassandra CLUSTERING ORDER thi hành thứ tự sắp xếp trên đĩa dữ liệu trong vòng khóa phân vùng.
  • Mặc dù bạn sẽ không thể nhận hàng được kích hoạt gần đây nhất cho mỗi bảng, bạn có thể mô hình thiết kế để trả lại hàng đó cho bạn cho mỗi phân vùng .

tl; dr; Truy vấn trong Cassandra là MUCH khác với MySQL hoặc bất kỳ RDBMS nào. Nếu truy vấn hàng upserted cuối cùng (cho một phân vùng) là một cái gì đó bạn cần phải làm, có lẽ có những cách mà bạn có thể mô hình hóa bảng của bạn để hỗ trợ nó.

+0

Cảm ơn Aaron .. :) – Mohanish

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