找不到要求的操作的编解码器:[varchar <-> java.lang.Double],从spark结构插入到Datastax cassandra

时间:2019-07-27 14:16:22

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

我正在使用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

1 个答案:

答案 0 :(得分:0)

再次查看消息后-您的数据未匹配表结构。只需添加显式转换...

此外,要在DataStax Java驱动程序中使用Scala类型,您可以从java-driver-scala-extras存储库中获取编解码器。不幸的是,没有针对它的“官方” jar构建,因此您需要自己编译和部署代码,或者仅将代码片段包含到您的项目中。 DataStax开发人员博客上有一个blog post,说明了其实现方式。