我在 cassandra 中有一个表,它是一个集合类型,并且在 scala 中创建了案例类:
case class test(
var status: Option[Set[String]]
)
现在我正在尝试使用 cassandra java 驱动程序核心将数据从 cassandra 检索到 scala 中的这个案例类:
Option(row.getSet("status", classOf[String]))
Error :
found : Set[String] (in java.util)
required: Set[String] (in scala.collection.immutable)
如何从 cassandra 访问 set 类型到 scala case set?
我访问它的完整方法是:
def getData(id: String): Option[test] = {
try {
val result = session.execute(
s"SELECT * FROM $Keyspace.table WHERE id=?",
id
)
if (result.getAvailableWithoutFetching != 1) {
logger.error(s"Failed to find $Id")
None
} else {
val row = result.one()
Some(test(
id,
Option(row.getSet("customer_status", classOf[String]))
))
}
} catch {
case e: IllegalArgumentException =>
logger.error(s"Requested column names incorrect when attempting to get customer record: $e")
None
case e: Exception =>
logger.error(s"Exception in getting customer record for customer $id: $e")
None
}
}
我可以使用
Option(row.getSet("status", classOf[String]).asScala.toSet)
并且必须导入:
import scala.collection.JavaConverters._
尝试从 Cassandra 行检索集合并将其分配给 Scala 集合时,您似乎遇到了类型不匹配错误。问题是 Cassandra Java 驱动程序返回 Java Set,但您的 Scala 案例类需要 Scala Set。您需要将 Java 集转换为 Scala 集。
以下是如何修改方法来处理此转换
import scala.collection.JavaConverters._
case class Test(
var status: Option[Set[String]]
)
def getData(id: String): Option[Test] = {
try {
val result = session.execute(
s"SELECT * FROM $Keyspace.table WHERE id=?",
id
)
if (result.getAvailableWithoutFetching != 1) {
logger.error(s"Failed to find $Id")
None
} else {
val row = result.one()
Some(Test(
id,
Option(row.getSet("customer_status", classOf[String])).map(_.asScala.toSet)
))
}
} catch {
case e: IllegalArgumentException =>
logger.error(s"Requested column names incorrect when attempting to get customer record: $e")
None
case e: Exception =>
logger.error(s"Exception in getting customer record for customer $id: $e")
None
}
}
在此修订后的代码中:
JavaConverters 的引入是为了提供 Java 和 Scala 集合之间的隐式转换。 row.getSet("customer_status", classOf[String]) 调用返回 Java Set[String]。 _.asScala.toSet 将 Java 集转换为 Scala 不可变集。 其余代码保持不变。
确保包含 JavaConverters 和任何其他所需库的必要导入。