2015-08-28 58 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