cassandra - Datastax java driver, convert scala collections to java error -


i trying store scala map (that i'm trying convert java.util.map) cassandra 2.1.8.

the data structure looks this:

map[string -> set[tuple[string, string, string]]] 

i created table follows:

create table mailing (emailaddr text primary key, totalmails bigint, emails map<text, frozen<set<tuple<text, text, text>>>>); 

i first try convert set's java set's:

def emailstocassandra(addr: emailaddress, mail: mailcontent, number: int) = { println("inserting emails cassandra")  mail.emails.foreach(result =>    setasjavaset(result._2) ) 

i build query , attempt convert map java map:

val query = querybuilder.insertinto("emails", "mailing")                         .value("emailaddr", addr.tostring())                         .value("totalmails", number)                         .value("emails", mapasjavamap(mail.emails)) session.executeasync(query) 

i back:

java.lang.illegalargumentexception: value 1 of type class scala.collection.convert.wrappers$mapwrapper not correspond cql3 type 

i tried this:

val lol = mail.emails.asinstanceof[java.util.map[string, java.util.set[tuple3[string, string, string]]]] 

which didn't work

thank in advance

there few things going need overcome here:

  1. converting map java.util.map type. (you've covered using mapasjavamap)
  2. converting set[tuple3] java.util.set type.
  3. converting tuple3 tuplevalue.

unfortunately error returned driver (java.lang.illegalargumentexception: value 1 of type class scala.collection.convert.wrappers$mapwrapper not correspond cql3 type) misleading, map type converting correctly in code, tuple3 type having problems with. opened java-833 track this.

i'm making assumptions mailcontent is, here code should make things work. main logic heavy lifting emailstocql maps tuple3[string, string, string] tuplevalue, set java.util.set , map java.util.map.

import com.datastax.driver.core.{datatype, tupletype, cluster} import com.datastax.driver.core.querybuilder.querybuilder  import scala.collection.javaconverters._  object scratch extends app {    val cluster = cluster.builder().addcontactpoint("127.0.0.1").build()   val session = cluster.connect()    session.execute("create keyspace if not exists emails replication = { 'class' : 'simplestrategy', 'replication_factor' : 1 };")   session.execute("create table if not exists emails.mailing (emailaddr text primary key, totalmails bigint, emails map<text, frozen<set<tuple<text, text, text>>>>);")    val emailtype = tupletype.of(datatype.text(), datatype.text(), datatype.text())    case class mailcontent(addr: string, emails: map[string, set[tuple3[string, string, string]]]) {     lazy val emailstocql = emails.mapvalues {       _.map(v => emailtype.newvalue(v._1, v._2, v._3)).asjava     }.asjava   }    val mailcontent = mailcontent("test@email.com", map(     "dest@email.com" -> set(("field1", "field2", "field3")),     "dest2@email.com" -> set(("2field1", "2field2", "2field3"))))    val query = querybuilder.insertinto("emails", "mailing")                 .value("emailaddr", mailcontent.addr)                 .value("totalmails", mailcontent.emails.size)                 .value("emails", mailcontent.emailstocql)    session.execute(query)    cluster.close() } 

this yields record looks following in cqlsh:

 emailaddr      | emails                                                                                                       | totalmails ----------------+--------------------------------------------------------------------------------------------------------------+------------  test@email.com | {'dest2@email.com': {('2field1', '2field2', '2field3')}, 'dest@email.com': {('field1', 'field2', 'field3')}} |          2 

Comments