使用Scala更新Cassandra DB中的字符串列表列

时间:2019-04-09 09:58:45

标签: scala cassandra apache-kafka

我是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]]...)

我目前没有找到任何可以帮助我上网的东西

1 个答案:

答案 0 :(得分:0)

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

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

  1. 首先,由于Cassandra不会分别解析每个语句,因此将加快执行速度;
  2. 绑定变量会更容易,因为您无需关心相应的字符串表示形式

但是请务必谨慎使用Scala-Java驱动程序期望Java的列表,集合,映射和基类型(例如ints等)。您可能会使用java-driver-scala-extras package,但需要自己对其进行编译,因为它在Maven Central中不可用。