在 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 中选择的主要内容,如果未能解决你的问题,请参考以下文章
如何解决 Cassandra 中的问题“ConfigurationException:列族 ID 不匹配”
如何在从 Spark 消费 Kafka 时获取偏移 id,将其保存在 Cassandra 中并使用它来重新启动 Kafka?