Cassandra - Truy vấn một cột với loại bộ sưu tập


7

Tôi khá mới với cassandra, vì vậy xin lỗi tôi nếu điều này hóa ra là một câu hỏi ngớ ngẩn.

Tôi có một cấu trúc bảng như dưới đây

CREATE TABLE data_points (
  id text PRIMARY KEY,
  created_at timestamp,
  previous_event_id varchar,
  properties map<text,text>
);

Tôi muốn biết, liệu tôi có thể thực hiện một truy vấn cung cấp các bản ghi khớp từ các maptrường loại không.

Chẳng hạn, nếu tôi chèn các giá trị vào bảng như bên dưới

INSERT INTO datapoints (id, properties) VALUES ('1', { 'fruit' : 'apple', 'band' : 'Beatles' });

Tôi có thể lấy nó dưới dạng

SELECT * from data_points WHERE properties.band='Beatles';

Xin vui lòng giúp đỡ.


Hướng dẫn duy nhất tôi tìm thấy cho đến nay dường như không cung cấp câu trả lời trực tiếp cho vấn đề này, nhưng có lẽ cú pháp này sẽ hoạt động : SELECT * from data_points WHERE properties['band'] = 'Beatles';?
Andriy M

Tôi đã thử @AndriyM này, nhưng đã gặp lỗi sauBad Request: line 1:44 no viable alternative at input '['
Rohit

Câu trả lời:


15

Bạn có thể lập chỉ mục các loại bộ sưu tập trong cassandra 2.1 trở lên. Bạn đang theo sau:
SELECT * FROM <table> WHERE <field> CONTAINS <value_in_list/map/set>

Ví dụ chi tiết:

cqlsh> USE ks;
cqlsh:ks> CREATE TABLE data_points (
            id text PRIMARY KEY,
            created_at timestamp,
            previous_event_id varchar,
            properties map<text,text>
         );
cqlsh:ks> create index on data_points (properties);
cqlsh:ks> INSERT INTO data_points (id, properties) VALUES ('1', { 'fruit' : 'apple', 'band' : 'Beatles' });
cqlsh:ks> INSERT INTO data_points (id, properties) VALUES ('2', { 'fruit' : 'cherry', 'band' : 'Beatles' });
cqlsh:ks> SELECT * FROM data_points WHERE properties CONTAINS 'Beatles';

 id | created_at | previous_event_id | properties
----+------------+-------------------+----------------------------------------
  2 |       null |              null | {'band': 'Beatles', 'fruit': 'cherry'}
  1 |       null |              null |  {'band': 'Beatles', 'fruit': 'apple'}

(2 rows)

Lời cảnh báo, các chỉ mục phụ không mở rộng quy mô khi chúng sử dụng thuật toán phân tán / thu thập để tìm thứ bạn cần, nếu bạn có kế hoạch sử dụng chúng để gắn thẻ nặng, tốt hơn là nên chuẩn hóa propertiestrường trong một bảng riêng biệt và thực hiện nhiều truy vấn.

Đọc thêm:


@Lyuben Tôi sẽ không thể kiểm tra câu trả lời này vào lúc này. Vì vậy, bây giờ chỉ là một upvote :)
Rohit

0

Trong trường hợp của bạn về bản đồ (hoặc bộ / danh sách), rõ ràng, "Không thể đọc một phần cột thu thập trong CQL. Cách duy nhất để truy xuất dữ liệu từ bộ sưu tập là đọc toàn bộ bộ sưu tập".

/programming/16024839/select-specific-value-from-map

Tuy nhiên, nếu truy vấn của bạn được thiết lập, cập nhật hoặc xóa, chúng sẽ hoạt động tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.