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:
- converting map java.util.map type. (you've covered using mapasjavamap)
- converting set[tuple3] java.util.set type.
- 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
Post a Comment