Cassandra - Fragt eine Spalte mit dem Auflistungstyp ab

7

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 Typfeldern liefert map.

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.

Rohit
quelle
Das einzige Handbuch, das ich bisher gefunden habe, scheint keine direkte Antwort darauf zu geben, aber vielleicht würde diese Syntax funktionieren : SELECT * from data_points WHERE properties['band'] = 'Beatles';?
Andriy M
Ich habe dieses @AndriyM ausprobiert, aber den folgenden Fehler erhaltenBad Request: line 1:44 no viable alternative at input '['
Rohit

Antworten:

15

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 herauszufinden, was Sie benötigen. Wenn Sie sie für starkes Tagging verwenden möchten, ist es möglicherweise besser, das propertiesFeld in einer separaten Tabelle zu denormalisieren und auszuführen mehrere Abfragen.

Weiterführende Literatur:

Lyuben Todorov
quelle
@ Lyuben Ich kann diese Antwort im Moment nicht testen. Also nur eine positive Bewertung für jetzt :)
Rohit
0

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".

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

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

kisna
quelle