Cassandra:搜索NULL值

时间:2015-08-28 14:40:33

标签: 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个不同的节点,每个节点根据其标题更新一行i-e节点1只更新rssi1,节点2只更新rssi2等。这显然为其他列创建了空值。

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

我希望能够在MYSQL中查询类似SELECT *FROM MACRecord where RSSI1 != NULL的示例。但是,在CQL中似乎不支持空值和比较运算符,例如!=。

是否有替代使用NULL值或特殊标志?我插入浮动,所以不像字符串我不能插入类似''的东西。这个问题有什么可行的解决方法?

编辑:

我在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'”。

1 个答案:

答案 0 :(得分:2)

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

或者您可以为每个rssiX值创建一个不同的表,以便它们都不为null。

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

SELECT sum(rssi1)WHERE macadd =' someadd';

sum()函数在Cassandra 2.2中可用。

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