Scala反射异常: <none> 不是一个术语。

13

我在Spark中有以下代码:

rdd
  .map(processFunction(_))
  .saveToCassandra("keyspace", "tableName")

何处

def processFunction(src: String): Seq[Any] =
  src match {
   case "a" => List(A("a", 123112, "b"), A("b", 142342, "c"))
   case "b" => List(B("d", 12312, "e", "f"), B("g", 12312, "h", "i"))
  }

在哪里:

case class A(entity: String, time: Long, value: String)
case class B(entity: String, time: Long, value1: String, value2: String)

saveToCassandra 期望一个对象集合,并使用 Seq[Any] 作为返回类型来同时包含 Seq[A]Seq[B] ,这会导致 saveToCassandra 报错,错误信息为 - scala.ScalaReflectionException: <none> is not a term。可能的原因是什么?


你解决了吗?我目前也遇到了同样的问题。 - LiMuBei
2个回答

1
我遇到了这个问题,将case类应用于此可以帮助您解决此问题。
以下是示例。
 case class test_row(col1: String,
                col2: String,
                col3: String)

并将此案例类应用于 df/rdd。

df.map { x => test_row.apply(x.get(0).asInstanceOf[String], x.get(1).asInstanceOf[String],x.get(2).asInstanceOf[String])
}.rdd.saveToCassandra   

这个问题的解决方案是“none”不是一个术语。

1
def processFunction(src: String): (Any, Any) = {
  src match {
   case "a" => (A("a", 123112, "b"), A("b", 142342, "c"))
   case "b" => (B("d", 12312, "e", "f"), B("g", 12312, "h", "i"))
  }
}

这样的方法可能有效。我还没有在cassandra中尝试过保存对象或与之一起使用。不过,上述解决方案在没有使用case类和anys的情况下是我最近解决此类问题的方法。例如,以下内容将起作用。

def processFunction(src: String): (String, Int, String) = {
   src match {
     case "a" => ("a", 123112, "b")
     case "b" => ("d", 12312, "e")
   }
}

然而,那不完全是你想要的。所以,无论你怎么想,都可以接受。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接