首页 > 解决方案 > 插入 NULL 值时如何避免 cassandra 墓碑

问题描述

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

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

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

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

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

我的用例:我有事件流,每个事件都由 causeID 标识。我收到许多具有相同 causeId 的事件,我只想存储相同 causeID 的最新事件(使用 upsert)。事件的属性可以从 NULL 变为特定值,也可以从特定值变为 NULL。不幸的是,后一种情况会产生墓碑并降低读取性能。

更新

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

标签: cassandraspark-cassandra-connector

解决方案


您不能将 NULL 插入 Cassandra - 它在那里具有特殊含义,并导致创建您观察到的墓碑。如果您想将 NULL 视为特殊值,为什么不在应用程序端解决这个问题 - 当您获得null状态时,只需插入任何无法在表中使用的特殊值,当您读回数据时,检查它特殊值并输出null到请求者...


推荐阅读