我正在使用Apache Spark和Cassandra,我希望用spark-cassandra-connector将我的RDD保存到Cassandra。
以下是代码:
def saveToCassandra(step: RDD[(String, String, Date, Int, Int)]) = {
step.saveToCassandra("keyspace", "table")
}
大部分时间都可以正常工作,但会覆盖数据库中已存在的数据。我不想覆盖任何数据。它有可能吗?
答案 0 :(得分:4)
我的工作是:
rdd.foreachPartition(x => connector.WithSessionDo(session => {
someUpdater.UpdateEntries(x, session)
// or
x.foreach(y => someUpdater.UpdateEntry(y, session))
}))
上面的connector
是CassandraConnector(sparkConf)
。
它不如简单的saveToCassandra
那么好,但它允许细粒度的控制。
答案 1 :(得分:1)
我认为在foreach分区之外使用WithSessionDo会更好。该呼叫涉及的开销不需要重复。