我正在使用dse 5.1.0(与spark 2.0.2.6和scala 2.11.8打包在一起)。 读取卡桑德拉表,如下所示。
val sparkSession = ...
val rdd1 = sparkSession.table("keyspace.table")
此表包含一个List[String]
列,例如list1,我在scala rdd中读取了该数据,例如rdd1。但是当我尝试使用编码器时,会引发错误。
val myVoEncoder = Encoders.bean(classOf[myVo])
val dataSet = rdd1.as(myVoEncoder)
我尝试过
scala.collection.mutable.list
,
scala.collection.immutable.list
,
scala.collection.list
,
Seq
,
WrappedArray
。都出现了如下相同的错误。
java.lang.UnsupportedOperationException: Cannot infer type for class scala.collection.immutable.List because it is not bean-compliant
MyVo.scala
case class MyVo(
@BeanProperty var id: String,
@BeanProperty var duration: Int,
@BeanProperty var list1: List[String],
) {
def this() = this("", 0, null)
}
将提供任何帮助。
答案 0 :(得分:3)
您应该使用Array[String]
:
case class MyVo(
@BeanProperty var id: String,
@BeanProperty var duration: Int,
@BeanProperty var list1: Array[String]
) {
def this() = this("", 0, null)
}
尽管需要强调,但更惯用的方法是:
import sparkSession.implicits._
case class MyVo(
id: String,
duration: Int,
list1: Seq[String]
)
rdd1.as[MyVo]