我正在尝试将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")
答案 0 :(得分:3)
我刚刚意识到ClassCastException
与我的UDT MySeqFloatWrapper
以及我在那里定义的sqlType
有关,显然这与Spark 1.5没有被认为是合适的,但是不再使用Spark 1.6(另请参阅SPARK-12878)。
如果您需要模板来了解如何正确定义UDT,请参阅github上的VectorUDT
示例。