Spark(SQL /结构化流)Cassandra - PreparedStatement

时间:2017-03-31 12:24:21

标签: apache-spark cassandra spark-streaming spark-dataframe spark-cassandra-connector

我实时使用Spark Structured Streaming进行机器学习,我希望在我的Cassandra集群中存储预测。

由于我处于流式上下文中,每秒执行多次相同的请求,因此必须使用PreparedStatement进行一次强制优化。

在cassandra spark驱动程序(https://github.com/datastax/spark-cassandra-connector)中,没有办法使用PreparedStatement(在scala或python中,我不考虑java作为选项)

我应该使用scala(https://github.com/outworkers/phantom)/ python(https://github.com/datastax/python-driver)cassandra驱动程序吗? 它是如何工作的,我的连接对象需要序列化才能传递给工人?

如果有人可以帮助我!

谢谢:)

1 个答案:

答案 0 :(得分:2)

为了做一个准备好的声明,然后在使用结构化火花流处理流处理时在Cassandra中注册数据,您需要:

  • import com.datastax.driver.core.Session
  • import com.datastax.spark.connector.cql.CassandraConnector

然后,构建连接器:

 val connector = CassandraConnector.apply(sparkSession.sparkContext.getConf) 

同时拥有会话连接器,您现在可以调用您在Statement中编写的 准备好的Statement 函数斯卡拉类

 connector.withSessionDo { session =>
 Statements.PreparedStatement()

}

您最终可以通过以下函数在Cassandra中编写数据来完成, cql 是将变量绑定到准备好的Statement并执行它的函数:

  private def processRow(value: Commons.UserEvent) = {
  connector.withSessionDo { session =>
  session.execute(Statements.cql(value.device_id, value.category, value.window_time, value.m1_sum_downstream, value.m2_sum_downstream))
}

}

当然,您必须在foreach writer中调用此函数( processRow

     // This Foreach sink writer writes the output to cassandra.
import org.apache.spark.sql.ForeachWriter
val writer = new ForeachWriter[Commons.UserEvent] {
  override def open(partitionId: Long, version: Long) = true
  override def process(value: Commons.UserEvent) = {
    processRow(value)
  }
  override def close(errorOrNull: Throwable) = {}
}

val query =
  ds.writeStream.queryName("aggregateStructuredStream").outputMode("complete").foreach(writer).start