Cassandra:在列中获取最后一个非空值

标签 cassandra cql cql3

我有一个 Cassandra 表,其中每列可以包含一个值或 NULL。但如果它包含 NULL,我知道该列中的所有下一个值也都是 NULL。

类似这样的事情:

+------------+---------+---------+---------+
|       date | column1 | column2 | column3 |
+------------+---------+---------+---------+
| 2017-01-01 |       1 |     'a' |    NULL |
| 2017-01-02 |       2 |     'b' |    NULL |
| 2017-01-03 |       3 |    NULL |    NULL |
| 2017-01-04 |       4 |    NULL |    NULL |
| 2017-01-05 |    NULL |    NULL |    NULL |
+------------+---------+---------+---------+

我需要一个查询,对于给定的列,返回具有非空值的最后一列的日期。在这种情况下:

  • 对于第 1 列,“2017-01-04”
  • 对于第 2 列,“2017-01-02”
  • 对于第3列,没有返回结果。

在 SQL 中,它会是这样的:

SELECT date
FROM my_table
WHERE column1 IS NOT NULL
ORDER BY date DESC LIMIT 1

是否有可能以任何方式,或者我应该将表分成每列一个表以避免出现 NULL 情况?

最佳答案

tldr;创建一个新表来单独跟踪这一点。

只有当“列 1”是主键的一部分、具有二级索引或具有物化 View 时,这才可能实现。

您不希望主键为空。顺便说一句,请确保您将“UNSET”写入表的其余部分以代替 null。这应该由驱动程序处理,但有些驱动程序还不是很成熟。写入 null 实际上是一个删除操作,并且会导致逻辑删除。

辅助索引会带来性能问题,因为它们可能会影响整个集群,并且在超出某个点后无法很好地扩展。

物化 View 已被弃用,因此可能会避免使用这些 View 。

创建一个单独的表来跟踪这个确切的功能可能会为您提供更好的服务。这意味着多次写入和多次读取,但会避免大型表扫描和二级索引。

我假设您的分区不是按日期排列的,并且您有宽行,因为它使这变得更简单,但这就是它的样子。

CREATE TABLE my_table (
  partition bigint,
  date text,
  column1 bigint,
  column2 text,
  column3 text,
PRIMARY KEY(partition, date);

CREATE TABLE offset_tracker(
  partition bigint,
  date text,
PRIMARY KEY(partition);

在这里,您可以执行select date FROM offset_tracker WHERE partition=x来获取“具有值的最大日期”。

关于Cassandra:在列中获取最后一个非空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47538799/

相关文章:

cassandra - 如何更改 Cassandra 中的 PARTITION KEY 列?

在时间戳列上使用等于运算符的 Cassandra 查询不起作用

Cassandra 1.1 复合键/列和分层查询

cql - `create index` 在 cassandra 表中做什么?

java - 使用java插入列表<text> cassandra

java - 使用 DataStax Java 驱动程序 1.0.4 通过 CQL 连接到 Cassandra 时出现异常

python - 如何使用cql引擎将图像存储为cassandra数据库中的字节字段?

cassandra - 如何检查 Cassandra 节点上的本地提示目录?

apache-spark - Spark Cassandra Java 集成问题

java - Cassandra 在一致性 LOCAL_ONE 读取查询期间失败(需要 1 个响应,但只有 0 个副本响应,1 个失败)