当您执行显式 DELETE、插入 null 值或数据被 TTLed 时,会创建墓碑。
如果你没有为特定列指定值,那么这个单元格的数据根本就没有设置,如果你之前有一些以前的数据,那么它们不会被覆盖,直到你明确地将它们设置为 @987654323 @。但在 Spark 中,通常情况有所不同——默认情况下,它会插入空值,直到您不将 spark.cassandra.output.ignoreNulls 指定为 true - 在这种情况下,它会将空值视为未设置,并且不会覆盖以前的数据。
但是当您指定不完整的行时,只会更新提供的部分,保持以前的数据不变。
如果我们有下表和数据:
create table test.v2(id int primary key, valid boolean, v int);
insert into test.v2(id, valid, v) values(2,True, 2);
insert into test.v2(id, valid, v) values(1,True, 1);
我们可以检查数据在 Spark 中是否可见:
scala> val data = spark.read.cassandraFormat("v2", "test").load()
data: org.apache.spark.sql.DataFrame = [id: int, v: int ... 1 more field]
scala> data.show
+---+---+-----+
| id| v|valid|
+---+---+-----+
| 1| 1| true|
| 2| 2| true|
+---+---+-----+
现在更新数据:
scala> import org.apache.spark.sql.SaveMode
import org.apache.spark.sql.SaveMode
scala> val newData = Seq((2, false)).toDF("id", "valid")
newData: org.apache.spark.sql.DataFrame = [id: int, valid: boolean]
scala> newData.write.cassandraFormat("v2", "test").mode(SaveMode.Append).save()
scala> data.show
+---+---+-----+
| id| v|valid|
+---+---+-----+
| 1| 1| true|
| 2| 2|false|
+---+---+-----+