2015-02-16 33 views
17

Wstawiam do tabeli Cassandra z kolumnami znacznika czasu. Dane Mam pochodzi z precyzją mikrosekund, więc ciąg danych czas wygląda następująco:Cassandra cqlsh - jak wyświetlić mikrosekundy/milisekundy dla kolumn timestamp?

2015-02-16T18: 00: 03,234 + 00: 00

Jednak w cqlsh kiedy biegnę select zapytanie o dane mikrosekundy nie jest wyświetlane, widzę tylko czas do drugiej precyzji. Dane o mikrosekundach nie są wyświetlane.

Chyba mam dwa pytania:

1) Czy Cassandra uchwycić mikrosekund z typu danych timestamp? Zgaduję, że tak?

2) Jak mogę to sprawdzić za pomocą cqlsh, aby zweryfikować?

definicja Tabela:

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

zapytań Insert biegł z Java PreparedStatment:

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

Wybierz zapytanie zostało po prostu:

select * from data; 
+0

Czy możesz edytować swój post z definicją tabeli, zapytaniem 'INSERT' i' SELECT'? Nie wiem na pewno, dopóki nie zobaczę tych informacji, ale Twój problem może być związany z tym: http://stackoverflow.com/questions/26237940/cassandra-cql-select-query-not-returning-records- which- have-timestamp-as-cluster/ – Aaron

+0

Właśnie zaktualizowałem mój post, gdy pytałeś. Daj mi znać, jeśli nie jest to wystarczająco jasne. Dziękuję Ci. – WillZ

Odpowiedz

37

Starając się odpowiedzieć na Twoje pytania, zrobiłem trochę kopać na tym.

  1. Czy Cassandra przechwytuje mikrosekundy z typem danych timestamp?

Mikrosekundy nie, milisekundy tak. Jeśli utworzyć tabelę, wstawić wiersz, i starają się go zapytać o czas ściętego, to nie działa:

[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) 

Ale kiedy kwerendy dla tych samych id i type wartości, określając milisekund:

[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) 

Więc milisekundy są zdecydowanie tam. Utworzono bilet JIRA dla tego problemu (CASSANDRA-5870), ale został rozwiązany jako "Nie naprawi".

  1. Jak mogę to sprawdzić za pomocą cqlsh, aby zweryfikować?

Jednym z możliwych sposobów, aby faktycznie sprawdzić, milisekundy są rzeczywiście tam jest gniazdo funkcja timestampAsBlob() wewnątrz blobAsBigint(), tak:

[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) 

Chociaż nie jest optymalna, tutaj można wyraźnie zobaczyć milisekundę wartość "234" na samym końcu. Staje się to jeszcze bardziej oczywiste, jeśli dodać do tego samego wiersza datownika, ale bez milisekund:

[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

Dziękuję za szczegółową odpowiedź, jest to bardzo pomocne. Mogę pracować z rozwiązaniem, które tam masz. Myślę, że w praktyce odzyskałbym programowo czas tak długo, jak to działa, powinno być dobrze. Czy istnieje preferencja przechowywania znacznika czasu w formacie bigint, a następnie w tym przypadku? – WillZ

+0

@Will Szczerze to zależy od twojego przypadku użycia. Jeśli obawiasz się precyzji czasu, przechowywanie go jako timeuuid byłoby drogą do zrobienia. Ale jeśli milisekundy są bardziej polem ładowności lub uporządkowaniem wyników, mógłbym zobaczyć, jak działa bigint dla ciebie. – Aaron

+1

Tak, dla mnie zamawianie ma znaczenie. pomyśli o tym. dzięki! – WillZ

7

Można configure the output format obiektów datetime w pliku .cassandra/cqlshrc, używając składni Pythona „strftime”.

Niestety, dyrektywa %f dla mikrosekund (nie wydaje się być dyrektywa w milisekundach) does not work dla starszych wersji Pythona, co oznacza, że ​​muszą spaść z powrotem do roztworu blobAsBigint(timestampAsBlob(date)).

1

Niemożliwe jest wskazanie mikrosekund (1 milionowej sekundy) przy użyciu datownika "datownik" Cassandry, ponieważ największa precyzja dostępna dla tego typu danych wynosi milisekundy (1 tysięczna część sekundy).

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

Wartości typu timestamp są zakodowane jako 64-bitowa liczb reprezentujących liczbę milisekund od czasu standardowego bazowej zwanej epoki

2

myślę o " mikrosekund "(np. 03.234567) masz na myśli" milisekundy "(np. (03.234) .

Problem dotyczył błędu cqlsh podnieść ułamkowe sekundy, gdy mamy do czynienia z sygnaturami czasowymi.

Tak więc, podczas gdy wartość milisekundy została zachowana w rzeczywistej warstwie trwałości (cassandra), powłoka (cqlsh) nie wyświetliła ich.

Było to prawdą nawet jeśli były zmiany w .cqlshrctime_format wyświetlanie ułamków sekund z dyrektywy (np %Y-%m-%d %H:%M:%S.%f%z) %f. W tej konfiguracji cqlsh wyrenderowałby 3.000000 dla naszej wartości 3.234, ponieważ problem polegał na tym, jak cqlsh ładował obiekty datetime bez ładowania częściowych sekund.

To wszystko, co zostało powiedziane, problem został rozwiązany w CASSANDRA-10428 i wydany w Cassandra 3.4.