有关如何将map cql类型与DataStax java驱动程序一起使用的示例

时间:2013-12-03 13:22:36

标签: cassandra cql datastax datastax-java-driver

我正在尝试使用datastax java驱动程序来更新和查询具有映射字段的列族。有没有人关于如何在数据库Java驱动程序中使用cql集合的示例?

由于

3 个答案:

答案 0 :(得分:5)

我将添加一些将CQL集合与简单和预处理语句一起使用到当前Java驱动程序文档的示例。

您可以将CQL集合与预准备语句一起使用。快速入门部分的Java驱动程序文档中有一个示例。

http://docs.datastax.com/en/developer/java-driver/2.0/java-driver/quick_start/qsSimpleClientBoundStatements_t.html

步骤4将Java HashSet对象绑定到歌曲表中的CQL set列。

答案 1 :(得分:4)

通常我会问你尝试了什么,但我知道这不在Java Driver的DataStax文档中。我会介绍一下对我有用的东西。

有几点需要注意:

  • DataStax Cassandra Java类指导我将我的变量直接放入CQL文本字符串(而不是绑定映射)。我猜测绑定集合在制作时不起作用(对于课堂视频)。
  • 无法使用DevCenter查询集合,因此如果您想查看应用程序之外的内容,则需要通过cqlsh命令行检查其值。

要更新现有行(在“users”表中有Map<varchar,varchar> phone_numbers),请尝试以下操作:

String cqlQuery = "UPDATE users SET phone_numbers = phone_numbers + ";
cqlQuery += "{'" + phoneType + "':'" + phoneNumber+ "'} ";
cqlQuery += "WHERE username = ?";

PreparedStatement preparedStatement = getSession().prepare(cqlQuery);
BoundStatement boundStatement = preparedStatement.bind(user);
getSession().execute(boundStatement);

更好的方法(假设Map<String,String> phoneNumbers)是将集合绑定到预准备语句,如下所示:

String cqlQuery = "UPDATE users SET phone_numbers = ? ";
cqlQuery += "WHERE username = ?";

PreparedStatement preparedStatement = getSession().prepare(cqlQuery);
BoundStatement boundStatement = preparedStatement.bind(phoneNumbers,user);
getSession().execute(boundStatement);

同样,要把它读出来:

String cqlQuery2 = "SELECT phone_numbers FROM users WHERE username = ?";

PreparedStatement preparedStatement2 = getSession().prepare(cqlQuery2);
BoundStatement boundStatement2 = preparedStatement2.bind(user);
ResultSet result2 = getSession().execute(boundStatement2);

Map<String,String> newMap = result2.one().getMap("phone_numbers", String.class, String.class);

他们今天在DataStax Academy上的(免费)CAS101J课程中介绍了这一点。

答案 2 :(得分:0)

我是这样做的;这包含Cassandra中元组列的映射以及Cassandra中的映射列。我使用Scala和DataStax Cassandra Java驱动程序

需要进口

import java.lang
import java.text.SimpleDateFormat

import com.datastax.driver.core._
import com.datastax.driver.core.querybuilder.QueryBuilder

import scala.collection.Map
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import com.datastax.spark.connector.cql.CassandraConnector
import org.apache.spark.rdd.RDD
import scala.collection.JavaConversions._

代码段

val simpleDateFormat: SimpleDateFormat = new SimpleDateFormat("dd-MM-yyyy H:mm:ss")
val start_date: java.util.Date = simpleDateFormat.parse(val("StartTime").replaceAll(":(\\s+)", ":"))

val b_tuple= session.getCluster().getMetadata().newTupleType(DataType.cint(), DataType.cint(), DataType.text())
val time_tuple = session.getCluster().getMetadata().newTupleType(DataType.timestamp(), DataType.timestamp())

val time_tuple_value = time_tuple.newValue(start_date, end_date)
val b_tuple_value = bin_cell_tuple.newValue(b._1: lang.Integer, b._2: lang.Integer, val("xxx"))

val statement_2: Statement = QueryBuilder.insertInto("keyspace", "table_name")
          .value("b_key", bin_cell_tuple_value)
          .value("time_key", time_tuple_value)
          .value("some_map", mapAsJavaMap(my_scala_map))
session.executeAsync(statement_2)