2015-08-28 60 views
1

我有一个表MACRecord在卡桑德拉如下:卡桑德拉:搜索NULL值

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

我有各自基于它的标题即节点1刚刚更新RSSI1,节点2只更新在更新行5个不同的节点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

你打算如何工作?您不能查询不在密钥中的字段。您可能不得不重新考虑您的数据模型。 – jny

回答

2

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

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

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

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

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

你也许可以用用户定义的函数/聚合函数做一些技巧,但是我认为有多个表格会更简单。

+0

是的,这是人们在Cassandra建模时需要有点创意才能解决的问题之一。 – Aaron

+0

我看过商店,他们指定空字符串为空等效。 – phact