Scala Spark:GenericMutableRow不能强制转换为java.lang.Byte和<;无>;这不是一个术语
我试图将Spark(v.1.6)数据帧中的数据存储到Cassandra。我成功地运行了页面上的示例,但是,我仍然坚持使用自己的代码。考虑下面的片段:Scala Spark:GenericMutableRow不能强制转换为java.lang.Byte和<;无>;这不是一个术语,scala,apache-spark,spark-cassandra-connector,Scala,Apache Spark,Spark Cassandra Connector,我试图将Spark(v.1.6)数据帧中的数据存储到Cassandra。我成功地运行了页面上的示例,但是,我仍然坚持使用自己的代码。考虑下面的片段: case class MyCassandraRow(id : Long, sfl : Seq[Float]) df.map(r => MyCassandraRow( r.getAsLong(0), r.getAs[MySeqFloatWrapper]("sfl").getSeq()) ).saveTo
case class MyCassandraRow(id : Long, sfl : Seq[Float])
df.map(r =>
MyCassandraRow(
r.getAsLong(0),
r.getAs[MySeqFloatWrapper]("sfl").getSeq())
).saveToCassandra("keyspace", "table")
MySeqFloatWrapper
是一个UDT,我写道,它有一个方法getSeq()
,并返回一个Seq[Float]
不幸的是,如果我运行这个代码,我会得到一个
java.lang.ClassCastException: org.apache.spark.sql.catalyst.expressions.GenericMutableRow cannot be cast to java.lang.Byte
实际上,即使我这样做(如果我做了行(r.getLong(0))
),我也会得到这个异常,但如果我写:
df.map(r => r.getLong(0)).collect()
另一方面,如果我在case类周围添加一行,然后写
df.map(r =>
Row(
MyCassandraRow(
r.getAsLong(0),
r.getAs[MySeqFloatWrapper]("sfl").getSeq())
)
).saveToCassandra("keyspace", "table")
我得到以下例外情况:
scala.ScalaReflectionException: <none> is not a term
scala.ScalaReflectionException:不是术语
我刚刚意识到ClassCastException
与我的UDTmyseqfloatrapper
和我在那里定义的sqlType
有关,显然,就Spark 1.5而言,它运行良好,但Spark 1.6不再运行(另请参见)
如果您需要一个模板来了解如何正确定义UDT,请参见上的VectorUDT
示例