【问题标题】:Update a String list column in Cassandra DB with Scala使用 Scala 更新 Cassandra DB 中的字符串列表列
【发布时间】:2019-08-30 14:02:50
【问题描述】:

我是 Cassandra 和 Scala 的新手,我正在研究一个 Kafka 消费者(用 Scala 编写),它必须根据接收到的数据更新 Cassandra 上的一行字段。 到目前为止没有问题。

在这一行中,一个字段是一个字符串列表,当我进行更新时,这个字段没有改变,所以我必须给它自己分配相同的字符串列表。

UPDATE keyspaceName.tableName
SET fieldToChange = newValue
WHERE id = idValue
AND fieldA = '${currentRow.getString("fieldA")}'
AND fieldB = ${currentRow.getInt("fieldB")}
...
AND fieldX =  ${currentRow.getList("fieldX", classOf[String]).toString}
...

但我什至收到异常:

com.datastax.driver.core.exceptions.SyntaxError: line 19:49 no viable alternative at input ']' (... 482                   AND fieldX =  [[listStringItem1]]...)

我目前还没有找到任何可以帮助我通过网络的东西

【问题讨论】:

    标签: scala apache-kafka cassandra datastax-java-driver


    【解决方案1】:

    问题在于 Scala 的列表字符串表示与 Cassandra's representation of the list 不匹配,因此会产生错误。

    与其直接在代码中构造 CQL 语句,不如使用PreparedStatement 并将变量绑定到它:

    1. 首先,它将加快执行速度,因为 Cassandra 不会单独解析每个语句;
    2. 绑定变量会更容易,因为您不需要关心相应的字符串表示

    但是使用 Scala 时要非常小心 - Java 驱动程序需要 Java 的列表、集合、映射和基本类型,如整数等。您可以查看 java-driver-scala-extras package,但您需要自己编译它,因为它在 Maven Central 上不可用。

    【讨论】:

    • 我不会使用任何驱动程序/lib,我无法更改服务器。此外,如果我要这样做,我必须在课堂上改变很多东西。有没有办法准备要注入更新脚本的字符串列表?
    • 如何在不使用驱动程序的情况下从 Scala 访问 Cassandra?您是通过cqlsh 发出命令吗?
    • 如果您不想使用其他任何东西,只需正确格式化文本 - 我已经回答了示例字符串列表应该如何格式化的链接...
    猜你喜欢
    • 1970-01-01
    • 2016-04-06
    • 2021-01-08
    • 1970-01-01
    • 2017-11-07
    • 2016-08-09
    • 2015-11-07
    • 2020-11-21
    • 1970-01-01
    相关资源
    最近更新 更多