scala.ScalaReflectionException:<none>不是一个术语

时间:2015-11-19 18:40:34

标签: scala apache-spark spark-cassandra-connector

我在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,但异常 - {{ 1}}不是一个术语。这种行为可能是什么原因?

2 个答案:

答案 0 :(得分:0)

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中保存对象并没有太多玩耍。也没有使用任何cassandra。但是,上面没有案例类和anys的解决方案是我最近解决这个问题的方法。例如,下面的内容可行。

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

然而,这并不是你想要的。所以是的,按照你的意愿去做。

答案 1 :(得分:0)

我遇到了这个问题,在此方面应用案例类将有助于您解决此问题。

以下是示例。

 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   

这个解决'无'不是术语问题。