Spark:GenericMutableRow无法转换为java.lang.Byte,<none>不是术语

时间:2016-03-16 09:01:32

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

我正在尝试将Spark(v.1.6)DataFrame中的数据存储到Cassandra。我设法在Spark Cassandra Connector页面上运行示例,但是,我坚持使用自己的代码。请考虑以下代码段:

2

case class MyCassandraRow(id : Long, sfl : Seq[Float]) df.map(r => MyCassandraRow( r.getAsLong(0), r.getAs[MySeqFloatWrapper]("sfl").getSeq()) ).saveToCassandra("keyspace", "table") 是一个UDT,我写道,它有一个方法MySeqFloatWrapper并返回getSeq()

不幸的是,如果我运行此代码,我会得到一个

Seq[Float]

实际上,即使我这样做,我也会得到这个例外(如果我这样做java.lang.ClassCastException: org.apache.spark.sql.catalyst.expressions.GenericMutableRow cannot be cast to java.lang.Byte ),但是如果我写的话,我就会得到这个例外:

Row(r.getLong(0))

另一方面,如果我在我的案例类中添加df.map(r => r.getLong(0)).collect() 并且我写了

Row

我得到以下异常:

df.map(r => 
  Row(
   MyCassandraRow(
        r.getAsLong(0),
        r.getAs[MySeqFloatWrapper]("sfl").getSeq())
  )
).saveToCassandra("keyspace", "table")

1 个答案:

答案 0 :(得分:3)

我刚刚意识到ClassCastException与我的UDT MySeqFloatWrapper以及我在那里定义的sqlType有关,显然这与Spark 1.5没有被认为是合适的,但是不再使用Spark 1.6(另请参阅SPARK-12878)。

如果您需要模板来了解如何正确定义UDT,请参阅github上的VectorUDT示例。