11

我在 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]中断-不是一个术语。这种行为的原因可能是什么?saveToCassandrascala.ScalaReflectionException: <none>

4

2 回答 2

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 中保存对象。也没有与 cassandra 一起使用。但是,上述没有案例类和任何类的解决方案是我最近解决此类问题的方法。例如,以下将起作用。

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

但是,这并不是您想要的。所以,是的,随心所欲。

于 2016-12-22T17:40:02.277 回答
1

我遇到了这个问题,对此应用案例类将帮助您解决此问题。

下面是示例。

 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   

解决的“无”不是术语问题。

于 2017-02-19T23:51:42.220 回答