我有一个只有几列的Cassandra表,我想从Spark 2.4.0更新其中之一(还有多列呢?)。但是,如果我不提供所有列,那么记录就不会更新。
Cassandra模式:
rowkey,message,number,timestamp,name 1,hello,12345,12233454,ABC
关键点是Spark DataFrame
由rowkey
组成,该时间戳记带有已更新的时间戳,必须在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
答案 0 :(得分:1)
说明是SaveMode
,用于指定将DataFrame保存到数据源的预期行为。(不仅对于c *,而且对于任何数据源)。可用的options是
- SaveMode.ErrorIfExists
- SaveMode.Append
- SaveMode.Overwrite
- SaveMode.Ignore
在这种情况下,由于您已经有数据并且想要追加,因此必须使用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文档