Erreur de valeur sérialisée non valide lors de la lecture d'une carte des objets JSON strints de Cassandra 1.2 à l'aide du pilote de DataStax 1.0.5 Java et de Cassaforte

StackOverflow https://stackoverflow.com//questions/23062125

Question

J'utilise Cassaforte 1.3.0-Beta9, Cassandra 1.2 (DataStax) et com.Datastax.cassandra / Cassandra-Driver-Core 1.0.5 (puisque 2.0 ne fonctionne pas avec Cassandra 1.2).J'ai une table avec le schéma suivant:

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

Ceci est un exemple de ce qui est stocké dans une rangée:

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

Lorsque j'essaie de lire la colonne devices, je reçois l'erreur suivante:

com.datastax.driver.core.exceptions.InvalidTypeException: Invalid serialized value for type map<text, text> (String didn't validate.)
    at com.datastax.driver.core.DataType.deserialize(DataType.java:503)

Je peux lire la colonne de périphériques sans problèmes à l'aide de CQLSH (montré ci-dessus).Les valeurs stockées sur la carte sont des objets JSON strints.

Voici le flux de travail de l'échantillon:

(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 from entities where 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 this error:
;; InvalidTypeException Invalid serialized value for type map<text, text> (String didn't validate.)  com.datastax.driver.core.DataType.deserialize (DataType.java:503)

J'ai essayé le même flux de travail à l'aide de CQL brut et de Cassaforte, et les résultats étaient exactement les mêmes:

(require '[clojurewerkz.cassaforte.client :as cassaclient])

;; SELECT on empty devices:
(cassaclient/execute session "SELECT * FROM entities WHERE 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\"}'} WHERE id = '3e0730d4672538307056a30615aaaa333107d94e';")

;; update worked ok, cqlsh (select devices from entities where 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 * FROM entities WHERE id = '3e0730d4672538307056a30615aaaa333107d94e';")

;; Returns this error:
;; InvalidTypeException Invalid serialized value for type map<text, text> (String didn't validate.)  com.datastax.driver.core.DataType.deserialize (DataType.java:503)

Toute aide et / ou suggestions sur la manière dont les objets JSON doivent être stockés dans la collection de cartes de Cassandra seront grandement appréciés.

Était-ce utile?

La solution

(Mainteneur Cassaforte ICI)

n'ai pas vu cette question jusqu'à présent,

C'était un problème avec la version 1.0.5 de DataStax Driver. Cassaforte est actuellement à 2.0.0, la question est fermée avec n'importe quelle version ci-dessus BETA12. Plus d'infos Ici: https://github.com/clojurewerkz/cassaforte/issues/41

Utilisez la dernière version de Cassaforte et essayez de vous coller à la version du pilote Java qui est livré avec Cassaforte et tout ira bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top