我想使用Pyspark API将结构流数据写入Cassandra。
我的数据流如下:
Nifi - >卡夫卡 - > Spark Structure Streaming - >卡桑德拉
我试过以下方式:
query = df.writeStream\
.format("org.apache.spark.sql.cassandra")\
.option("keyspace", "demo")\
.option("table", "test")\
.start()
但是收到以下错误消息: " org.apache.spark.sql.cassandra"不支持流式写入。
我尝试过另一种方法:[来源 - DSE 6.0 Administrator Guide]
query = df.writeStream\
.cassandraFormat("test", "demo")\
.start()
但是有异常:AttributeError:' DataStreamWriter'对象没有属性&cassandraFormat'
有人能告诉我如何进一步了解吗?
提前致谢。
答案 0 :(得分:4)
升级DSE 6.0(最新版本)后,我可以将结构化流数据写入Cassandra。 [Spark 2.2&卡桑德拉3.11]
参考代码:
query = fileStreamDf.writeStream\
.option("checkpointLocation", '/tmp/check_point/')\
.format("org.apache.spark.sql.cassandra")\
.option("keyspace", "analytics")\
.option("table", "test")\
.start()
DSE文档网址:https://docs.datastax.com/en/dse/6.0/dse-dev/datastax_enterprise/spark/structuredStreaming.html
答案 1 :(得分:2)
此答案用于将数据写入Cassandra,而不是DSE(which supports Structured Streaming for storing data)
对于Spark 2.4.0及更高版本,可以使用foreachBatch方法,该方法允许您使用Spark Cassandra Connector提供的Cassandra批处理数据写入器,将流查询的每个微批处理的输出写入Cassandra:
import org.apache.spark.sql.cassandra._
df.writeStream
.foreachBatch { (batchDF, _) =>
batchDF
.write
.cassandraFormat("tableName", "keyspace")
.mode("append")
.save
}.start
对于低于2.4.0的Spark版本,您需要实现一个foreach接收器。
import com.datastax.spark.connector.cql.CassandraConnector
import com.datastax.driver.core.querybuilder.QueryBuilder
import com.datastax.driver.core.Statement
import org.apache.spark.SparkConf
import org.apache.spark.sql.Row
class CassandraSink(sparkConf: SparkConf) extends ForeachWriter[Row] {
def open(partitionId: Long, version: Long): Boolean = true
def process(row: Row) = {
def buildStatement: Statement =
QueryBuilder.insertInto("keyspace", "tableName")
.value("key", row.getAs[String]("value"))
CassandraConnector(sparkConf).withSessionDo { session =>
session.execute(buildStatement)
}
}
def close(errorOrNull: Throwable) = Unit
}
然后您可以按以下方式使用foreach接收器:
df.writeStream
.foreach(new CassandraSink(spark.sparkContext.getConf))
.start
答案 2 :(得分:1)