clojure - Invalid serialised value error when reading a map of stringified json objects from Cassandra 1.2 using DataStax 1.0.5 java driver and Cassaforte -
i'm using cassaforte 1.3.0-beta9, cassandra 1.2 (datastax), , com.datastax.cassandra/cassandra-driver-core 1.0.5 (since 2.0 not work cassandra 1.2). have table following schema:
create table entities ( id text, address_country text, address_county text, address_region text, address_street_two text, csv_uploads list<text>, documents list<text>, name text, notes list<text>, photos list<text>, project_id text, property_code text, property_data text, retrofit_completion_date text, metering_point_ids text, devices map<text,text>, user_id text, primary key (id) )
this example of what's stored in row:
7b237da126d39ccf98f80d78b6145a10828970f8 | {'b9d88015c84312bf24cef0e7f1a0baf98dbc8d8d': '{"metadata":{"passivrole":"zone 1 temperature,zone 1 temperature"}, "readings": [{"type":"temperature","resolution":"120","accuracy":"0.1","period":"instant"}, {"type":"interpolatedtemperatureair","resolution":100,"accuracy":"0.1","period":"instant"}], "description":"external air temperature sensor", "entity-id":"3e0730d4672538307056a30615aaaa333107d94e"}', 'd2fe3dca47b760dd67759a56ee0ebbc2cb3395f4': '{"metadata":{"passivrole":"zone 1 humidity"}, "readings":[{"type":"blah","resolution":"120","accuracy":"0.1","period":"instant"}], "description":" air humidity sensor", "entity-id":"3e0730d4672538307056a30615aaaa333107d94e"}'} | alice
when try read devices
column following error:
com.datastax.driver.core.exceptions.invalidtypeexception: invalid serialized value type map<text, text> (string didn't validate.) @ com.datastax.driver.core.datatype.deserialize(datatype.java:503)
i can read devices column no problems using cqlsh (which shown above). values stored in map stringified json objects.
here's sample workflow:
(require '[clojurewerkz.cassaforte.client :as cassaclient] ' [clojurewerkz.cassaforte.query :as cassaquery] ' [clojurewerkz.cassaforte.cql :as cql]) ;; select on empty devices: (binding [cassaclient/*default-session* session] (let [entity (cql/select :entities (cassaquery/where :id "3e0730d4672538307056a30615aaaa333107d94e"))] (prn "retrieved entity: " entity))) ;; returns vector of results, no errors: "retrieved entity: " [{:retrofit_completion_date nil, :notes nil, :property_code "3e49de0-12af-012e-4f3a-12313b0348f8", :devices nil, :name nil, :user_id "alice", :csv_uploads nil, :project_id "0b4f512fb7834a0878252ab144a525d424445ba2", :photos nil, :property_data nil, :metering_point_ids "[\"1\" \"2\"]", :address_street_two nil, :documents nil, :address_region nil, :address_country nil, :address_county nil, :id "3e0730d4672538307056a30615aaaa333107d94e"}] ;; update using cassaforte: (binding [cassaclient/*default-session* session] (cql/update :entities {:devices {"0edf9e09bce895caf0342ac6ae12511555930362" "{:metadata {\"passivrole\" \"zone 1 humidity\"}, :readings [{\"type\" \"tba\", \"resolution\" \"90\", \"accuracy\" \"0.2\", \"period\" \"instant\"}], :description \"lalalala\", :entity-id \"3e0730d4672538307056a30615aaaa333107d94e\"}"}} (cassaquery/where :id "3e0730d4672538307056a30615aaaa333107d94e"))) ;; update worked ok, cqlsh (select devices entities id = '3e0730d4672538307056a30615aaaa333107d94e';) ;; returns correct map: ;; {'0edf9e09bce895caf0342ac6ae12511555930362': '{:metadata {"passivrole" "zone 1 humidity"}, :readings [{"type" "tba", "resolution" "90", "accuracy" "0.2", "period" "instant"}], :description "lalalala", :entity-id "3e0730d4672538307056a30615aaaa333107d94e"}'} ;; select using cassaforte (binding [cassaclient/*default-session* session] (let [entity (cql/select :entities (cassaquery/where :id "3e0730d4672538307056a30615aaaa333107d94e"))] (prn "retrieved entity: " entity))) ;; returns error: ;; invalidtypeexception invalid serialized value type map<text, text> (string didn't validate.) com.datastax.driver.core.datatype.deserialize (datatype.java:503)
i've tried same workflow using raw cql , cassaforte, , results same:
(require '[clojurewerkz.cassaforte.client :as cassaclient]) ;; select on empty devices: (cassaclient/execute session "select * entities id = '3e0730d4672538307056a30615aaaa333107d94e';") ;; returns vector of results, no errors: [{:retrofit_completion_date nil, :notes nil, :property_code "3e49de0-12af-012e-4f3a-12313b0348f8", :devices nil, :name nil, :user_id "alice", :csv_uploads nil, :project_id "0b4f512fb7834a0878252ab144a525d424445ba2", :photos nil, :property_data nil, :metering_point_ids "[\"1\" \"2\"]", :address_street_two nil, :documents nil, :address_region nil, :address_country nil, :address_county nil, :id "3e0730d4672538307056a30615aaaa333107d94e"}] ;; update using cassaforte: (cassaclient/execute session "update entities set devices = {'0edf9e09bce895caf0342ac6ae12511555930362' : '{:metadata {\"passivrole\" \"zone 1 humidity\"}, :readings [{\"type\" \"tba\", \"resolution\" \"90\", \"accuracy\" \"0.2\", \"period\" \"instant\"}], :description \"lalalala\", :entity-id \"3e0730d4672538307056a30615aaaa333107d94e\"}'} id = '3e0730d4672538307056a30615aaaa333107d94e';") ;; update worked ok, cqlsh (select devices entities id = '3e0730d4672538307056a30615aaaa333107d94e';) ;; returns correct map: ;; {'0edf9e09bce895caf0342ac6ae12511555930362': '{:metadata {"passivrole" "zone 1 humidity"}, :readings [{"type" "tba", "resolution" "90", "accuracy" "0.2", "period" "instant"}], :description "lalalala", :entity-id "3e0730d4672538307056a30615aaaa333107d94e"}'} ;; select using cassaforte (cassaclient/execute session "select * entities id = '3e0730d4672538307056a30615aaaa333107d94e';") ;; returns error: ;; invalidtypeexception invalid serialized value type map<text, text> (string didn't validate.) com.datastax.driver.core.datatype.deserialize (datatype.java:503)
any and/or suggestions on how json objects should stored in cassandra's map collection appreciated.
(cassaforte maintainer here)
haven't seen question until now,
this issue 1.0.5 version of datastax driver. cassaforte @ 2.0.0, issue closed wit version above beta12. more info here: https://github.com/clojurewerkz/cassaforte/issues/41
use latest version of cassaforte , try sticking version of java driver comes bundled cassaforte , it'll great.
Comments
Post a Comment