2015-02-16 9 views
17

Sto inserendo in una tabella Cassandra con colonne timestamp. I dati che ho fornito con precisione microsecondo, in modo che il tempo stringa di dati simile a questa:Cassandra cqlsh - come mostrare microsecondi/millisecondi per le colonne timestamp?

2015-02-16T18: 00: 03.234 + 00: 00

Tuttavia, in cqlsh Quando eseguo un prescelto interrogare i dati del microsecondo non viene mostrato, posso solo vedere il tempo fino alla seconda precisione. I dati di microsecondi non vengono visualizzati.

Credo di avere due domande:

1) Se Cassandra catturare microsecondi con tipo di dati timestamp? La mia ipotesi è si?

2) Come posso verificarlo con cqlsh per verificare?

definizione Tabella:

create table data (
    datetime timestamp, 
    id text, 
    type text, 
    data text, 
    primary key (id, type, datetime) 
) 
with compaction = {'class' : 'DateTieredCompactionStrategy'}; 

query di inserimento corse con Java PreparedStatment:

insert into data (datetime, id, type, data) values(?, ?, ?, ?); 

query di selezione è stata semplicemente:

select * from data; 
+0

Puoi modificare il tuo post con la definizione della tabella, 'INSERT' e' SELECT' query? Non ne sono sicuro fino a quando non vedo queste informazioni, ma il problema potrebbe essere correlato a questo: http://stackoverflow.com/questions/26237940/cassandra-cql-select-query-not-returning-records-which- have-timestamp-as-cluster/ – Aaron

+0

Ho appena aggiornato il mio post come richiesto. Fammi sapere se questo non è abbastanza chiaro. Grazie. – WillZ

risposta

37

Nel tentativo di rispondere alle vostre domande, ho fatto un po 'scavando su questo.

  1. Cassandra acquisisce microsecondi con tipo di data/ora?

microsecondi no, millisecondi si. Se creo il vostro tavolo, inserire una riga, e cercare di eseguire una query per il momento in tronco, non funziona:

[email protected]:stackoverflow> INSERT INTO data (datetime, id, type, data) 
VALUES ('2015-02-16T18:00:03.234+00:00','B26354','Blade Runner','Deckard- Filed and monitored.'); 
[email protected]:stackoverflow> SELECT * FROM data 
WHERE id='B26354' AND type='Blade Runner' AND datetime='2015-02-16 12:00:03-0600'; 

id | type | datetime | data 
----+------+----------+------ 

(0 rows) 

Ma quando ho interrogare per gli stessi id e type valori precisando millisecondi:

[email protected]:stackoverflow> SELECT * FROM data 
WHERE id='B26354' AND type='Blade Runner' AND datetime='2015-02-16 12:00:03.234-0600'; 

id  | type   | datetime     | data 
--------+--------------+--------------------------+------------------------------- 
B26354 | Blade Runner | 2015-02-16 12:00:03-0600 | Deckard- Filed and monitored. 

(1 rows) 

Quindi i millisecondi sono decisamente lì. È stato creato un ticket JIRA per questo numero (CASSANDRA-5870), ma è stato risolto come "Non risolverà".

  1. Come posso verificarlo con cqlsh?

Un possibile modo per verificare effettivamente che i millisecondi sono effettivamente lì, vale a nido funzione timestampAsBlob() interno blobAsBigint(), in questo modo:

[email protected]:stackoverflow> SELECT id, type, blobAsBigint(timestampAsBlob(datetime)), 
data FROM data; 

id  | type   | blobAsBigint(timestampAsBlob(datetime)) | data 
--------+--------------+-----------------------------------------+------------------------------- 
B26354 | Blade Runner |       1424109603234 | Deckard- Filed and monitored. 

(1 rows) 

Pur non ottimale, qui si può chiaramente vedere millisecondo valore di "234" alla fine. Questo diventa ancora più evidente se si aggiunge una riga per la stessa data e ora, ma senza millisecondi:

[email protected]:stackoverflow> INSERT INTO data (id, type, datetime, data) 
VALUES ('B25881','Blade Runner','2015-02-16T18:00:03+00:00','Holden- Fine as long as nobody unplugs him.'); 
[email protected]:stackoverflow> SELECT id, type, blobAsBigint(timestampAsBlob(datetime)), 
       ...  data FROM data; 

id  | type   | blobAsBigint(timestampAsBlob(datetime)) | data 
--------+--------------+-----------------------------------------+--------------------------------------------- 
B25881 | Blade Runner |       1424109603000 | Holden- Fine as long as nobody unplugs him. 
B26354 | Blade Runner |       1424109603234 |    Deckard- Filed and monitored. 

(2 rows) 
+0

Grazie per la risposta dettagliata, questo è molto utile. Posso lavorare con la soluzione che hai lì. Immagino che in pratica otterrei il timestamp di ritorno a livello di codice, fintanto che funziona dovrebbe andare bene. C'è una preferenza per memorizzare la data e l'ora in formato bigint, quindi in questo caso? – WillZ

+0

@Will Onestamente dipende dal tuo caso d'uso. Se ti preoccupi della precisione del tempo, memorizzarlo come timeuuid sarebbe la strada da percorrere. Ma se i millisecondi sono più di un campo di payload o di ordini dei risultati, allora potrei vedere un bigint che lavora per te. – Aaron

+1

Sì, per me l'ordine conta. penserò a questo. Grazie! – WillZ

7

È possibile configure the output format di oggetti datetime nel file .cassandra/cqlshrc, utilizzando la sintassi 'strftime' di pitone.

Purtroppo, la direttiva %f per microsecondi (non ci sembra essere una direttiva per millisecondi) does not work per le versioni più vecchie di Python, il che significa che si deve ripiegare alla soluzione blobAsBigint(timestampAsBlob(date)).

1

È impossibile mostrare i microsecondi (1 milionesimo di secondo) utilizzando il datatype Cassandra 'timestamp' perché la massima precisione disponibile per quel tipo di dati è millisecondi (1 millesimo di secondo).

http://docs.datastax.com/en/cql/3.1/cql/cql_reference/timestamp_type_r.html

valori per il tipo timestamp sono codificati come 64 bit interi con segno rappresentano un numero di millisecondi dal tempo base tipo noto anche come epoca

2

Credo da " microsecondi "(es. 03.234567) intendi" millisecondi "(ad es. (03.234).

Il problema era un errore cqlsh non riuscito upport frazionale di secondi quando si tratta di timestamp.

Quindi, mentre il valore in millisecondi è stato mantenuto nel livello di persistenza reale (cassandra), la shell (cqlsh) non è riuscita a visualizzarli.

Questo era vero anche se si dovesse cambiare time_format in .cqlshrc per visualizzare le frazioni di secondo con una %f direttiva (ad esempio %Y-%m-%d %H:%M:%S.%f%z). In questa configurazione cqlsh restituisce 3.000000 per il nostro valore 3.234, poiché il problema era in come cqlsh caricava gli oggetti datetime senza caricare i secondi parziali.

Ciò detto, questo problema è stato risolto in CASSANDRA-10428 e rilasciato in Cassandra 3.4.

Problemi correlati