【问题标题】:Does inserting into a Cassandra unset cell create a tombstone?插入 Cassandra 未设置单元格会创建墓碑吗?
【发布时间】:2020-01-27 10:43:41
【问题描述】:

我正在尝试使旧测量值失效,同时将它们保留在我的 Cassandra 设置中。给定以下表结构:

ID|Test|result|valid|valid2
1 | 1  |  10  | False| unset
2 | 1  |  11  | True| False
3 | 1  |  12  | True| True

带有主键(ID、测试)

现在,如果我使用连接器正常插入以下 SparkDataframe 和 mode("append")

ID|Test|valid2
1 | 1  | False

这会创建一个墓碑吗?目的是能够在必要时使我的表中的某些行“无效”。我知道当单元格过时时会创建墓碑。但是既然单元格中没有值,会不会创建墓碑呢?

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    当您执行显式 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|
    +---+---+-----+
    

    【讨论】:

    • 我需要保留“无效”行,因为该标志仅指示稍后应考虑进行某些分析的内容。但是,我在使用单个列作为“处理状态”标志时遇到了问题,即使“写入”完成并具有适当的仲裁集一致性级别,也不会更新。 stackoverflow.com/questions/58834477/… 因此,我正在考虑使用多列。这导致了我无法保证 upsert 完成的问题,因此需要额外的列。
    • 问题是——你需要旧数据吗?
    • 我需要数据。删不掉。
    • 如果您不为单元格提供值,您将得到“无” - 甚至不是墓碑。但是,如果您指定单元格并在其中插入 null/nothing,您将获得该单元格的墓碑。从你上面的描述看来你不是在做后者。
    • @Alex Ott 感谢您的回答。因此,如果我只在特定键的“未设置”列中插入它,它就像一个空白写入。
    猜你喜欢
    • 2023-03-18
    • 2017-08-16
    • 2021-04-22
    • 2017-09-17
    • 2023-03-08
    • 2019-05-17
    • 2019-05-25
    • 2016-05-31
    • 1970-01-01
    相关资源
    最近更新 更多