Cassandra:搜索 NULL 值

标签 cassandra cql

我在 Cassandra 中有一个表 MACRecord,如下所示:

CREATE TABLE has.macrecord (
    macadd text PRIMARY KEY,
    position int,
    record int,
    rssi1 float,
    rssi2 float,
    rssi3 float,
    rssi4 float,
    rssi5 float,
    timestamp timestamp
)

我有 5 个不同的节点,每个节点根据其标题更新一行,即节点 1 仅更新 rssi1,节点 2 仅更新 rssi2 等。这显然会为其他列创建空值。

我似乎无法找到一个查询,它只会给我那些不为空的行。具体来说,我提到了这个 post

我希望能够像 MYSQL 中的 SELECT *FROM MACRecord where RSSI1 != NULL 一样进行查询。然而,CQL 似乎不支持 null 值和 != 等比较运算符。

除了放置 NULL 值或特殊标志之外,还有其他选择吗?我正在插入 float ,因此与字符串不同,我无法插入类似“”的内容。此问题的可能解决方法是什么?

编辑:

我在 MYSQL 中的数据模型是这样的:

+-----------+--------------+------+-----+-------------------+-----------------------------+
| Field     | Type         | Null | Key | Default           | Extra                       |
+-----------+--------------+------+-----+-------------------+-----------------------------+
| MACAdd    | varchar(17)  | YES  | UNI | NULL              |                             |
| Timestamp | timestamp    | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| Record    | smallint(6)  | YES  |     | NULL              |                             |
| RSSI1     | decimal(5,2) | YES  |     | NULL              |                             |
| RSSI2     | decimal(5,2) | YES  |     | NULL              |                             |
| RSSI3     | decimal(5,2) | YES  |     | NULL              |                             |
| RSSI4     | decimal(5,2) | YES  |     | NULL              |                             |
| RSSI5     | decimal(5,2) | YES  |     | NULL              |                             |
| Position  | smallint(6)  | YES  |     | NULL              |                             |
+-----------+--------------+------+-----+-------------------+-----------------------------+

每个节点(1-5)都根据其编号从 MYSQL 进行查询,例如节点 1 "SELECT *FROM MACRecord WHERE RSSI1 is not NULL"

我按如下方式更新了 cassandra 中的数据模型,以便 rssi1-rssi5 现在是 VARCHAR 类型。

CREATE TABLE has.macrecord (
    macadd text PRIMARY KEY,
    position int,
    record int,
    rssi1 text,
    rssi2 text,
    rssi3 text,
    rssi4 text,
    rssi5 text,
    timestamp timestamp
)

我认为每个节点最初都会为记录插入字符串“NULL”,当实际的 rssi 数据到来时,它只会替换“NULL”字符串,这样就可以避免出现墓碑,并且或多或少会出现在用户面前这些值实际上不是有效的数据,因为它们被标记为“NULL”。

但是我仍然对如何像在 MYSQL 中那样检索结果感到困惑。 cassandra 中没有 != 运算符。我如何编写一个查询来给我一个结果集,例如“SELECT *FROM HAS.MACRecord where RSSI1 != 'NULL'”。

最佳答案

您只能根据 PRIMARY KEY 字段在 CQL 中选择行,根据定义,该字段不能为空。这也适用于二级索引。所以我认为 Cassandra 无法对数据字段进行您想要的过滤。您可以选择其他一些条件,然后编写客户端以忽略具有空值的行。

或者您可以为每个 rssiX 值创建一个不同的表,这样它们就不会为空。

如果您只对某种聚合感兴趣,则空值将被视为零。所以你可以这样做:

选择 sum(rssi1) WHERE macadd='someadd';

Cassandra 2.2 中提供了 sum() 函数。

您也许还可以使用用户定义的函数/聚合来执行某种技巧,但我认为拥有多个表会更简单。

关于Cassandra:搜索 NULL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32273646/

相关文章:

共享记录的 Cassandra 设计模式 (m :n)

java - 有效地检查大型数据集的子字符串

Cassandra 使用 TTL 计算项目插入(集群键)

java - Nutch - 尝试爬行时出现错误 : JAVA_HOME is not set.

cassandra - Cassandra 中的本地传输请求是什么?

sql - Go SQL 扫描/值接口(interface)问题

cassandra - 如何在 cqlsh 中获得一毫秒差异的结果

cassandra - Cassandra 中的查询将按特定字段对整个表进行排序

java - 我们如何将 com.datastax.driver.core.LocalDate 转换为 java.util.Date?

python - 如何在 "IN"运算符 Python Cassandra 驱动程序中使用 python 列表?