2013-05-12 7 views
5

ProblemSerializować dict Pythona do Cassandry 1.2 kolumnie

Próbuję zapisać zserializowaną obiekt (za pomocą cPickle) do 1,2 kolumnie Cassandra, Używam Pythona cql library. Ja już próbowałem definiowania kolumny jako tekst (string) i utf8 blob, w obu przypadkach mam otrzymania ten sam błąd:

obiekt jest dict Python:

obj = {'id':'sometextid', 
     'time_created':05/12/2013, #<---- datetime 
     'some other string property': 'some other value' 
} 

Błąd jest to:

raise cql.ProgrammingError("Bad Request: %s" % ire.why) 
cql.apivalues.ProgrammingError: Bad Request: line 31:36 no viable alternative at character '\' 

i patrząc na wykonywanej instrukcji CQI widzę kilka znaków „\” po trawieniu obiektu, na przykład:

Część marynowanych obiektu

cdatetime 
datetime 
p4 
(S'\x07\xdd\x03\x1c\x000\x13\x05\xd0<' 
tRp5 

Moje pytania

Jaki jest zwykły sposób szeregowania dict Pythona (łącznie datetimes), aby zapisać go do Cassandry 1.2 przy użyciu biblioteki CQI? Czy istnieje lepszy lub bardziej prosty sposób robienia tego?

Z góry dzięki!

+0

Nie zamierzam sprawić, że będzie to prawdziwa odpowiedź, ponieważ nie jestem zaznajomiony z Cassandrą. Ale czy sądzisz, że to się nie udaje, bo przestaje czytać przy pojedynczym cytacie? (Ponieważ interpretuje to jako cytowany ciąg znaków lub coś innego? A może próbuje interpretować ukośnik odwrotny -x jako znak kontrolny?) Jeśli tak, być może kodowanie JSON lub piksel -> Base64 będzie działać lepiej (ponieważ wszystkie są tekstem z dobrze zdefiniowane zasady cytowania). –

Odpowiedz

2

Kompletny Rozwiązaniem tego problemu jest określenie kolumny jako blob obejmują kodowanej szesnastkowo (jak zdefiniowano w Dokumentach CASSANDRA w przypadku typu kropelkowego) w ten sposób:

obj_to_store = cPickle.dumps(input_obj).encode("hex") 

W ten sposób można serializować zwykłego ducha Pythona. Zwykle mam na myśli to, że może zawierać wszystko, co może zrobić python dict, w tym dane czasu lub cokolwiek chcesz i będzie poprawnie serializowane i przechowywane w kassandrze.

Być może istnieje lepsze rozwiązanie, ale jak dotąd jest to jedyny znaleziony, który działa z dowolnym python dict.

Mam nadzieję, że to pomoże komuś!

1

Brzmi jak problem z prawidłową analizą łańcuchów biblioteki CQL. Dopóki to nie zostanie naprawione, jednym podejściem byłoby przekonwertowanie pikle na spakowany łańcuch za pomocą struct.

Alternatywnie, można zmienić kodowanie wartości naruszenie, za pomocą czegoś podobnego urllib

+0

W rzeczywistości nie jesteś daleko od odpowiedzi, i tak, problemem jest prawdopodobnie biblioteka CQL (znowu!) –

Powiązane problemy