【问题标题】:Example about how to use map cql type with DataStax java driver关于如何在 DataStax java 驱动程序中使用 map cql 类型的示例
【发布时间】:2013-12-19 13:59:47
【问题描述】:

我正在尝试使用 datastax java 驱动程序来更新和查询具有映射字段的列族。有没有人举例说明如何将 cql 集合与 Datastax Java 驱动程序一起使用?

谢谢

【问题讨论】:

    标签: cassandra cql datastax datastax-java-driver


    【解决方案1】:

    我将在当前的 Java 驱动程序文档中添加一些使用 CQL 集合以及简单语句和准备语句的示例。

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

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

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

    【讨论】:

    • 链接失效了
    • 链接已关闭,如果链接已关闭,请勿在未显示相关 sn-p 的情况下发布链接。
    【解决方案2】:

    通常我会问您尝试了什么,但我知道这不在 Java 驱动程序的 DataStax 文档中。我会经历对我有用的方法。

    有几点需要注意:

    • DataStax Cassandra Java 类指示我将变量直接放入 CQL 文本字符串(而不是绑定地图)。我猜绑定集合在制作时不起作用(用于课程视频)。
    • 无法使用 DevCenter 查询集合,因此您需要通过命令行使用 cqlsh 检查它们的值,如果您想查看它们在您的应用之外是什么。

    要更新现有行(在具有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 课程中介绍了这一点。

    【讨论】:

    【解决方案3】:

    这是我的做法;这具有 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._
    

    代码 sn-p

    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)
    

    【讨论】:

      猜你喜欢
      • 2016-11-29
      • 1970-01-01
      • 2017-01-26
      • 2017-05-25
      • 2016-05-23
      • 2013-10-07
      • 2014-02-28
      • 2015-07-01
      • 2016-11-14
      相关资源
      最近更新 更多