如何使用Datastax连接器从Spark Dataframe更新特定的Cassandra列集

时间:2018-12-26 07:59:23

标签: scala apache-spark apache-spark-sql cassandra-3.0 spark-cassandra-connector

我有一个只有几列的Cassandra表,我想从Spark 2.4.0更新其中之一(还有多列呢?)。但是,如果我不提供所有列,那么记录就不会更新。

Cassandra模式:

rowkey,message,number,timestamp,name
1,hello,12345,12233454,ABC

关键点是Spark DataFramerowkey组成,该时间戳记带有已更新的时间戳,必须在Cassandra表中对其进行更新。

我试图在选项之后选择列,但是似乎没有这种方法。

finalDF.select("rowkey","current_ts")
  .withColumnRenamed("current_ts","timestamp")
  .write
  .format("org.apache.spark.sql.cassandra")
  .options(Map("table" -> "table_data", "keyspace" -> "ks_data"))
  .mode("overwrite")
  .option("confirm.truncate","true")
  .save()

finalDF=
rowkey,current_ts
1,12233999

然后,Cassandra表中的值应为更新后,

rowkey,message,number,timestamp,name
1,hello,12345,12233999,ABC

我正在使用Dataframe API。因此无法使用rdd方法。我该怎么做? Cassandra版本3.11.3,Datastax连接器2.4.0-2.11

1 个答案:

答案 0 :(得分:1)

说明是SaveMode,用于指定将DataFrame保存到数据源的预期行为。(不仅对于c *,而且对于任何数据源)。可用的options

  
      
  1. SaveMode.ErrorIfExists
  2.   
  3. SaveMode.Append
  4.   
  5. SaveMode.Overwrite
  6.   
  7. SaveMode.Ignore
  8.   

在这种情况下,由于您已经有数据并且想要追加,因此必须使用SaveMode.Append

import org.apache.spark.sql.SaveMode

finalDF.select("rowkey","current_ts")
  .withColumnRenamed("current_ts","timestamp")
  .write
  .format("org.apache.spark.sql.cassandra")
  .options(Map("table" -> "table_data", "keyspace" -> "ks_data"))
  .mode(SaveMode.Append)
  .option("confirm.truncate","true")
  .save()

请参见SaveModes

上的spark文档