在 id != null 的 cassandra 中选择

Posted

技术标签:

【中文标题】在 id != null 的 cassandra 中选择【英文标题】:SELECT in cassandra where id != null 【发布时间】:2021-06-28 12:41:55 【问题描述】:

如何在 cassandra 中查询 != null 列。

Select * from tableA where id != null;
Select * from tableA where name != null;

然后我想存储这些值并将它们插入到不同的表中。

【问题讨论】:

where id is null? null 是数据库中的一个特殊值,具有传染性。使用 null 完成的任何操作都会被“感染”,并且结果会变成 null。你不能做null = null,必须使用特殊的is null语法。 将选择 * from tableA where id = null; where id is not null 也是。 select * from tableA where name is not null;错误请求:第 1:42 行输入“​​是”没有可行的替代方案 这是在 cassandra 而不是 mysql,只是一个提醒 【参考方案1】:

我认为 Cassandra 不可能做到这一点。首先,Cassandra CQL 不支持在 WHERE 子句中使用 NOT 或不等于运算符。其次,你的 WHERE 子句只能包含主键列,主键列不允许插入空值。不过我不确定二级索引,所以我运行了这个快速测试:

create table nullTest (id text PRIMARY KEY, name text);
INSERT INTO nullTest (id,name) VALUES ('1','bob');
INSERT INTO nullTest (id,name) VALUES ('2',null);

我现在有一个表和两行(其中一行包含空数据):

SELECT * FROM nullTest;

 id | name
----+------
  2 | null
  1 |  bob

(2 rows)

然后我尝试在名称上创建一个二级索引,我知道它包含空值。

CREATE INDEX nullTestIdx ON nullTest(name);

它让我做到了。现在,我将对该索引运行一个查询。

SELECT * FROM nullTest WHERE name=null;
Bad Request: Unsupported null value for indexed column name

同样,这是在您无法查询非 null 的前提下完成的,如果您甚至无法查询实际上可能为 null 的列值。

所以,我认为这是不可能的。此外,如果您的主键中可能存在空值,那么您可能需要重新评估您的数据模型。同样,我知道 OP 的问题是关于查询数据在哪里 not 为空。但正如我之前提到的,Cassandra CQL 没有 NOT 或 != 运算符,所以这将是一个问题。

另一种选择是插入一个空字符串而不是空值。然后,您将能够查询空字符串。但这仍然无法让您摆脱在主键字段中有 null 的基本设计缺陷。也许如果您有一个复合主键,并且它的一部分(集群列)可能是空的(当然不是分区键的一部分)。但是您仍然会遇到无法查询“非空”(而不是非空)行的问题。

注意:此处插入空值仅用于演示目的。这是您应该尽力避免的事情,因为插入空列值将创建一个墓碑。同样,插入大量空值会创建大量墓碑。

【讨论】:

我认为这已经过时了...issues.apache.org/jira/browse/CASSANDRA-3783 添加了对NULL 值的支持。 @JeffWidman 这张票具有误导性。 Cassandra 4.0(beta) 不支持插入空值,也不支持不等于运算符。 啊,我错过了对那张票的最后评论:这张票从它的原始范围收缩,变成了对插入一个空值的支持,实际上是在单元格上执行删除操作。目前没有对索引空值的选择支持,并且考虑到 Cassandra 的设计,这被认为是一个困难/禁止的问题。【参考方案2】:

1) 从测试中选择 *;

name             | id | address
------------------+----+------------------
    bangalore |  3 |       ramyam_lab
    bangalore |  4 | bangalore_ramyam
    bangalore |  5 |        jasgdjgkj
       prasad | 11 |             null
       prasad | 12 |             null
        india |  6 |          karnata
        india |  7 |          karnata
ramyam-bangalore |  3 |        jasgdjgkj
ramyam-bangalore |  5 |        jasgdjgkj

2)cassandra 不支持 null 值选择。它显示为 null 以便我们理解。

3) 对于空值的处理,使用另一个字符串,如“not-available”、“null”,然后我们可以选择数据

【讨论】:

以上是关于在 id != null 的 cassandra 中选择的主要内容,如果未能解决你的问题,请参考以下文章

如何使用datastax DevCenter在Cassandra中检查!= null?

Cassandra - 将一个巨大的字段设置为 null 而不归还磁盘空间

如何在 Python Cassandra 中获取最后插入的 id?

如何解决 Cassandra 中的问题“ConfigurationException:列族 ID 不匹配”

如何删除被替换后显示为null的节点?

如何在从 Spark 消费 Kafka 时获取偏移 id,将其保存在 Cassandra 中并使用它来重新启动 Kafka?