2016-03-23 12 views
1

Ich möchte eine Tabelle mit breiten Partitionen erstellen (oder, anders gesagt, eine Tabelle, die keine Wertespalten (Nicht-Primärschlüsselspalten) hat), die die effiziente Beschaffung von Zeilen in jeder seiner Partitionen ermöglicht. Hier ist eine einfache Definition einer solchen TabelleIst diese Art der Zählertabellendefinition gültig?

CREATE TABLE IF NOT EXISTS test_table 
(
    partitionKeyCol   timestamp 
    clusteringCol   timeuuid 
    partitionRowCountCol counter static 
    PRIMARY KEY    (partitionKeyCol, clusteringCol) 
) 

Das Problem bei dieser Definition, und andere wie es strukturiert ist, ist, dass ihre Gültigkeit nicht klar von der in der Dokumentation enthaltenen Informationen abgeleitet werden.

Was die Dokumentation tun Zustand (in Bezug auf Zähler):

  • Ein Zähler Spalte kann weder als Teil einer Tabelle die angegeben werden PRIMARY KEY, noch verwendet, um eine INDEX

  • zu erstellen Eine Zählersäule kann nur in einer eigenen Zählertabelle definiert werden (die ich für eine Tabelle halte, die ausschließlich Zählerspalten als ihre Wertespalten definiert hat)

Was die Dokumente beschreiben nicht (in Bezug auf Zähler):

  • Die Fähigkeit einer Tabelle eine statische Zählerspalte für sie (angesichts der einzigartigen Schreibpfad von Zählern definiert haben glaube ich, dass dies ist erwähnenswert)

  • die Fähigkeit einer Tabelle, die für sie Nullwert Spalten definiert (es eine gewidmet Zähler Tabelle, da mein Verständnis des Wortes), so dass auch eine haben statische Cou nter Spalte definiert dafür

die Informationen zu diesem Thema gegeben, dass in vorhanden ist (und außerhalb des) die Dokumente, eine solche Definition scheint gültig zu sein. Ich bin mir jedoch nicht sicher, wie das möglich ist, da die Aktualisierungen von partitionRowCountCol die Verwendung eines Schreibpfads erfordern, der sich von dem unterscheidet, der zum Einfügen von (partitionKeyCol, clusteringCol) Tupeln verwendet wird.

Ist diese Art von Zähler-Tabelle-Definition gültig? Wenn ja, wie werden Schreibvorgänge in die Tabelle ausgeführt?

Antwort

1

Es sieht aus wie eine Tabelle mit dieser Struktur definiert werden kann, aber ich habe Mühe, einen guten Anwendungsfall dafür zu finden. Es scheint, dass es keine Möglichkeit gibt, tatsächlich in diese Clustering-Spalte zu schreiben.

CREATE TABLE test.test_table (
    a timestamp, 
    b timeuuid, 
    c counter static, 
    PRIMARY KEY (a, b) 
); 

[email protected]:test> insert into test_table (a,b,c) VALUES (unixtimestampof(now()), now(), 3); 
InvalidRequest: code=2200 [Invalid query] message="INSERT statements are not allowed on counter tables, use UPDATE instead" 
[email protected]:test> update test_table set c = c + 1 where a=unixtimestampof(now()); 
[email protected]:test> update test_table set c = c + 1 where a=unixtimestampof(now()); 
[email protected]:test> select * from test_table; 

a      | b | c 
--------------------------+------+--- 
2016-03-24 15:04:31+0000 | null | 1 
2016-03-24 15:04:37+0000 | null | 1 

(2 rows) 
[email protected]:test> update test_table set c = c + 1 where a=unixtimestampof(now()) and b=now(); 
InvalidRequest: code=2200 [Invalid query] message="Invalid restrictions on clustering columns since the UPDATE statement modifies only static columns" 
[email protected]:test> insert into test_table (a,b) VALUES (unixtimestampof(now()), now()); 
InvalidRequest: code=2200 [Invalid query] message="INSERT statements are not allowed on counter tables, use UPDATE instead" 
[email protected]:test> update test_table set b = now(), c = c + 1 where a=unixtimestampof(now()); 
InvalidRequest: code=2200 [Invalid query] message="PRIMARY KEY part b found in SET part" 

Was versuchen Sie zu modellieren?

+0

Ich versuche, eine Zeitreihe auf eine Tag-basierte Weise zu partitionieren, und Weise eine Möglichkeit zur Verfügung zu stellen, um die Anzahl der Einträge an einem bestimmten Tag zu erhalten, ohne das Aggregat "COUNT" zu verwenden, von dem ich glaube, dass es einen Zeilenscan durchführt gibt das Ergebnis zurück. Die Zählung und die Tupel werden jedoch niemals gleichzeitig abgerufen, so dass die Aufnahme des Zählers in die Tabelle streng durch den Wunsch motiviert war, die Erstellung einer Tabelle nur dafür zu vermeiden. – Kevin

+0

Bei einer etwas verwandten Anmerkung finde ich es seltsam, dass eine nicht-lebensfähige Tabelle erfolgreich erstellt werden kann. Kann dies als Fehler angesehen werden? – Kevin

+0

Es ist seltsam. Ich könnte vorschlagen, ein JIRA-Ticket mit [Cassandra] (https://issues.apache.org/jira/browse/CASSANDRA) zu öffnen, wenn du denkst, dass es sich lohnt, es zu knöpfen. –