it-swarm.com.de

Cassandra - Eine Spalte mit dem Auflistungstyp abfragen

Ich bin ziemlich neu in Cassandra, also entschuldigen Sie mich, wenn sich herausstellt, dass dies eine dumme Frage ist.

Ich habe eine Tabellenstruktur wie unten

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

Ich wollte wissen, ob ich eine Abfrage ausführen kann, die übereinstimmende Datensätze aus den Feldern vom Typ map liefert.

Zum Beispiel, wenn ich Werte wie folgt in die Tabelle einfüge

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

Kann ich es als holen?

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

Bitte helfen Sie.

7
Rohit

Sie können Sammlungstypen in Cassandra 2.1 und höher indizieren. Sie sind hinter:
SELECT * FROM <table> WHERE <field> CONTAINS <value_in_list/map/set>

Detailliertes Beispiel:

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)

Ein Wort der Warnung: Sekundärindizes lassen sich nicht gut skalieren, da sie einen Scatter/Gather-Algorithmus verwenden, um das zu finden, was Sie benötigen. Wenn Sie sie für starkes Tagging verwenden möchten, ist es möglicherweise besser, das Feld properties int zu denormalisieren eine separate Tabelle und führen Sie mehrere Abfragen aus.

Weiterführende Literatur:

15
Lyuben Todorov

In Ihrem Fall einer Karte (oder eines Satzes/einer Liste) ist anscheinend "Teillesen von Sammlungsspalten in CQL nicht möglich. Die einzige Möglichkeit, Daten aus einer Sammlung abzurufen, besteht darin, die Sammlung in ihrer Gesamtheit zu lesen".

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

Wenn Ihre Abfrage jedoch eingestellt, aktualisiert oder entfernt wird, funktionieren sie einwandfrei.

0
kisna