插入 NULL 值时如何避免 cassandra 逻辑删除

Tom*_*los 5 cassandra spark-cassandra-connector

我的问题是 cassandra 在插入 NULL 值时创建墓碑。

据我了解,cassandra 不支持 NULL,当插入 NULL 时,它只会删除相应的列。一方面,这非常节省空间,但另一方面,它会创建墓碑,从而降低读取性能。

这违背了 NoSql 哲学,因为 cassandra 节省了空间,但降低了读取性能。在 NoSql 世界中,空间很便宜,但性能很重要。我相信这是以非规范化形式保存表背后的哲学。

我希望 cassandra 使用与插入任何其他值相同的技术来插入 NULL - 使用时间戳并在压缩期间保留最新条目 - 即使该条目为 NULL (或者我们可以称之为“未设置”)。cassandra 配置中是否有任何调整或任何方法如何能够在没有墓碑的情况下实现带有空值的更新插入?

我遇到了这个问题,但它只允许忽略 NULL 值

我的用例:我有事件流,每个事件都由 CauseID 标识。我收到许多具有相同 CauseId 的事件,并且我只想存储相同 CauseID 的最新事件(使用 upsert)。事件的属性可能从 NULL 更改为特定值,也可能从特定值更改为 NULL。不幸的是,后一种情况会生成逻辑删除并降低读取性能。

更新

看来我没有办法避开墓碑了。您能否建议我如何最小化它们的技术(将 gc_grace_seconds 设置为非常低的值)。有哪些风险?当节点宕机时间超过 gc_grace_seconds 时该怎么办?

Cha*_*ity 1

如果您在 INSERT 中特别提到 NULL,则无法避免墓碑。C* 在插入或写入数据之前不进行查找,这使得写入速度非常快。为此,C* 只是插入一个逻辑删除以避免稍后出现该值(采用比较时间戳的最新更新)。如果您想避免逻辑删除(建议这样做),则必须准备不同的查询组合来检查每个查询的 NULL,然后再将其添加到 INSERT。如果要检查的字段很少,那么只需添加一些 IF-ELSE 语句即可轻松完成。但如果它们太多,代码就会变得更大并且可读性更差。很快,您就不能插入 NULL,这会影响以后的读取性能。

将空值插入 cassandra