2016-03-23 18 views
16

ho creato un semplice tabe:Cassandra CQL SELECT COUNT con LIMIT

CREATE TABLE test (
    "type" varchar, 
    "value" varchar, 
    PRIMARY KEY(type,value) 
); 

ho inserito 5 file in esso:

INSERT INTO test(type,value) VALUES('test','tag1') 
INSERT INTO test(type,value) VALUES('test','tag2') 
INSERT INTO test(type,value) VALUES('test','tag3') 
INSERT INTO test(type,value) VALUES('test','tag4') 
INSERT INTO test(type,value) VALUES('test','tag5') 

mi sono imbattuto SELECT * from test LIMIT 3 e funziona come previsto.

type | value 
------+------ 
test | tag1 
test | tag2 
test | tag3 

Quando ho eseguito SELECT COUNT(*) from test LIMIT 3, produce:

count 
------- 
    5 

non dovrebbe dirlo 3?

Il Datastax documentation sembra suggerire che la specifica di LIMIT sovrascriverà il valore predefinito di 10.000. Perché non funziona in questo caso? Se è importante, sono su Cassandra 2.2.5 e ho eseguito tutte le query tramite cqlsh.

Aggiornamento Sia il conducente Java e CQLSH sono stati testati per dimostrare che LIMIT davvero non funziona come prescritto nella documentazione. Se ci sono dipendenti di Datastax che leggono, il tuo contributo sarebbe molto apprezzato.

risposta

10

La mia risposta spontanea a questo è che un conteggio di righe restituisce sempre solo una riga nel suo set di risultati, indicando il numero di righe trovate. Quindi qualsiasi LIMIT maggiore di 1 non avrebbe alcun effetto.

Come indicato correttamente da @light, la documentazione indica che il LIMIT deve essere applicato a count(*). E con buone ragioni anche. Secondo this blog post Cassandra non può fornire alcun metadati per ottenere il numero o le righe, ma deve ispezionare ogni partizione (su ogni nodo) per ottenere il numero. È quindi un'operazione molto costosa.

Tuttavia, contrariamente alla documentazione, quando si esegue una query su C * 2.2.4 con cqlsh o con il driver Java (v3.0.0) la clausola LIMIT non ha alcun effetto sul numero di righe segnalato. Nessuno dei due ha il limite predefinito di cqlsh di 10.000 righe. Né ha un LIMIT superiore a 10.000 se ce ne sono più di 10.000.

La documentazione e l'implementazione sembrano non sincronizzate. Sebbene quale sia errato non posso dire.

EDIT

Il biglietto fa riferimento @Abhishek Anand conclude che il documentation is wrong. Non il comportamento. Quindi, specificando un limite di 1, conterai tutte le tue righe. E questo è il comportamento desiderato.

+0

Se 'SELECT COUNT' restituisce sempre 1 riga, a' LIMIT 'la clausola è inutile in una query' SELECT COUNT', no? Perché la documentazione Datastax avrebbe fornito in particolare esempi come 'SELECT COUNT (*) FROM big_table LIMIT 50000;'? – light

+0

@light, um, hai ragione. La documentazione suggerisce che dovresti ottenere 3 come risultato del conteggio quando combinato con la clausola LIMIT. Questo [articolo] (http://www.planetcassandra.org/blog/counting-key-in-cassandra/) spiega perché applicare il limite a un conteggio è una buona cosa. Verificherò la mia istanza (C * v 2.2.4). Qual è la tua versione C *? – Ralf

+0

Sono su Cassandra v2.2.5 – light

1

La clausola limite viene utilizzata per limitare il numero di righe nel risultato. Il conteggio (*) restituisce solo una riga singola con il conteggio di (in questo caso) righe totali.

il "limite di 3" non influisce sul numero di occorrenze analizzate dal conteggio (*), se si desidera che questo, che più essere l'uso di un "dove"

+0

Grazie per la risposta. Se 'SELECT COUNT' restituisce sempre 1 riga, una clausola' LIMIT' è inutile in una query 'SELECT COUNT', no? Perché la documentazione Datastax avrebbe fornito in particolare esempi come 'SELECT COUNT (*) FROM big_table LIMIT 50000;'? – light

+0

fai riferimento a questa documentazione? -> "SELECT COUNT() FROM big_table LIMIT 50000; SELECT COUNT() FROM big_table LIMIT 200000; l'output di queste istruzioni se avessi 105,291 righe nel database sarebbe: 50000 e 105291" Penso che abbiano confuso –

+0

così la documentazione Datastax è errata? – light

9

Si tratta di un Bug in Cassandra e la versione 2.2 .x ne è affetto.

https://issues.apache.org/jira/browse/CASSANDRA-8216

hanno segnato come fisso, ma è chiaro che questo ha propagato alla versione oltre versione fissa.

In ogni caso, la luce, la tua ipotesi/pensiero è completamente corretta. La parola chiave Limit deve essere applicata al conteggio di cassandra (*) e funziona come dovrebbe nelle versioni su cui sto lavorando 3.2.4 e 2.1.x

Problemi correlati