从 Spark scala 中的 cassandra 检索集给出了类型不匹配的 java.utils

问题描述 投票:0回答:2

我在 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
    }
  }
scala cassandra spring-data-cassandra
2个回答
0
投票

我可以使用

Option(row.getSet("status", classOf[String]).asScala.toSet)

并且必须导入:

import scala.collection.JavaConverters._ 

0
投票

尝试从 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 和任何其他所需库的必要导入。

© www.soinside.com 2019 - 2024. All rights reserved.