Cassandra

Cassandra - 查詢具有集合類型的列

  • November 19, 2016

我對 cassandra 很陌生,所以如果這是一個愚蠢的問題,請原諒我。

我有一個表結構如下

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

我想知道,我是否可以執行從map類型欄位中提供匹配記錄的查詢。

例如,如果我在下表中插入值,如下所示

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

我能把它作為

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

請幫忙。

您可以在cassandra 2.1及更高版本中索引集合類型。你在追求:

SELECT * FROM <table> WHERE <field> CONTAINS <value_in_list/map/set>

詳細範例:

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)

警告詞,二級索引不能很好地擴展,因為它們使用分散/收集算法來找到你需要的東西,如果你打算將它們用於大量標記,最好將properties欄位非規範化到一個單獨的表中並執行多個查詢。

進一步閱讀:

在您的地圖(或集合/列表)的情況下,顯然,“在 CQL 中不可能部分讀取集合列。從集合中檢索數據的唯一方法是讀取整個集合”。

https://stackoverflow.com/questions/16024839/select-specific-value-from-map

但是,如果您的查詢正在設置、更新或刪除,它們可以正常工作。

引用自:https://dba.stackexchange.com/questions/55165