我正在使用Spark结构流从Kafka消费,并使用Foreach将其插入Datastax Cassandra。当我插入BigInt和String时,它正在插入,但是当我插入Double值时,它会抛出“找不到所请求操作的编解码器:[varchar <-> java.lang.Double]”。如何编写自定义编解码器以在SCALA中接受Double,Long值。
val view_a = VW_MS_PLAN_UNIT_LA
.writeStream
.option(WriteConf.IgnoreNullsParam.name, "true")
.queryName("VIEW PLAN UNIT LA")
.outputMode("Append")
.foreach(new CassandraSinkForeach)
.trigger(Trigger.ProcessingTime("10 seconds"))
.start()
df.show()
Spark(Printschema)的示例数据帧 a-字符串 b- Bigint C- Double
Cassandra表样本;- 创建表 一个字符串, b bigint, c双 )
var cassandraDriver: CassandraDriver = null;
var preparedStatement: PreparedStatement = null;
def open(partitionId: Long, version: Long): Boolean = {
// open connection
println(s"Open connection")
cassandraDriver = new CassandraDriver();
preparedStatement = cassandraDriver.connector.withSessionDo(session =>
session.prepare(s"""
insert into ${cassandraDriver.namespace}.${cassandraDriver.foreachTableSink}
(a, b, c) values(?, ?, ?)""")
true
}
def process(record: org.apache.spark.sql.Row) = {
println(s"Process new $record")
cassandraDriver.connector.withSessionDo(session =>
session.execute(preparedStatement.bind(${record.getAs[String](0)},
${record.getAs[BigInt](1)}, ${record.getAs[Double](2)}))
)
}
com.datastax.driver.core.exceptions.CodecNotFoundException:找不到请求的操作的编解码器:[varchar <-> java.lang.Double]。另外,我以前的帖子将有助于对其进行更多描述 How to change Datatypes of records inserting into Cassandra using Foreach Spark Structure streaming
答案 0 :(得分:0)
再次查看消息后-您的数据未匹配表结构。只需添加显式转换...
此外,要在DataStax Java驱动程序中使用Scala类型,您可以从java-driver-scala-extras存储库中获取编解码器。不幸的是,没有针对它的“官方” jar构建,因此您需要自己编译和部署代码,或者仅将代码片段包含到您的项目中。 DataStax开发人员博客上有一个blog post,说明了其实现方式。