2017-10-12 175 views
1

我是cassandra的新手,我試圖插入筆記本電腦映射列表的員工,如下所示,'laptoplist'是一個UDT。卡桑德拉嵌套查詢

cqlsh:sourceutilization> SELECT * from employee ; 

id | laptoplist                  | name  | type 
----+-----------------------------------------------------------------------------------+-----------+------------ 
    5 | [{laptopid: 5, cpu: 9, memory: 18, networkutilization: 25, diskutilization: 85}] | testname5 | staffType5 
    1 | [{laptopid: 1, cpu: 94, memory: 36, networkutilization: 13, diskutilization: 66}] | testname1 | staffType1 
    8 | [{laptopid: 8, cpu: 64, memory: 1, networkutilization: 15, diskutilization: 71}] | testname8 | staffType8 
    0 | [{laptopid: 0, cpu: 4, memory: 95, networkutilization: 20, diskutilization: 16}] | testname0 | staffType0 
    2 | [{laptopid: 2, cpu: 49, memory: 37, networkutilization: 20, diskutilization: 88}] | testname2 | staffType2 
    4 | [{laptopid: 4, cpu: 13, memory: 67, networkutilization: 67, diskutilization: 10}] | testname4 | staffType4 
    7 | [{laptopid: 7, cpu: 11, memory: 75, networkutilization: 75, diskutilization: 97}] | testname7 | staffType7 
    6 | [{laptopid: 6, cpu: 27, memory: 34, networkutilization: 2, diskutilization: 92}] | testname6 | staffType6 
    9 | [{laptopid: 9, cpu: 12, memory: 10, networkutilization: 19, diskutilization: 73}] | testname9 | staffType9 
    3 | [{laptopid: 3, cpu: 47, memory: 13, networkutilization: 72, diskutilization: 54}] | testname3 | staffType3 

現在,我想查詢類似下面,它是如何可能

select * from employee where laptoplist.networkutilization > 50; 

僅供參考,我使用3.1版本的卡桑德拉。

由於提前, 哈利

+0

[Cassandra - 帶有非主鍵缺陷的WHERE子句]的可能重複(https://stackoverflow.com/questions/35524516/cassandra-where-clause-with-non-primary-key-disadvantages) – muru

回答

2

這是行不通的好,原樣。在這裏得到你想要的東西需要進行一些更改。在Cassandra中有兩件事通常可以提供幫助。

  1. 如果您在使用數據模型時遇到問題,請問問自己它是什麼樣的時間序列。

藉助Cassandra的分佈式附加存儲引擎,可以輕鬆地調整時間序列和事件跟蹤等用例。有時候,當調整到這個角度時,數據模型更有意義(從Cassandra的角度來看)。

  1. 構建您的表以符合您的查詢模式。

我看到什麼可能是ID的主鍵。但是我沒有看到(至少在上面)是對ID進行過濾的任何查詢。我可以說,像員工和筆記本電腦這樣的東西很重要,而且可能是獨一無二的。但獨特的鍵並不總是使最好的信息過濾器。

要問的主要問題是,你想要在這裏得到什麼?

對我來說,它看起來像你想看到正在經歷高網絡利用率的用戶。高網絡利用率是一個(希望)暫時的事情,那麼爲什麼我們不添加一個時間組件(checkpoint_time)? IMO,隨着時間的推移跟蹤計算資源的利用率是有意義的。考慮到這些點後,我想出了這樣一個數據模型:

[email protected]:stackoverflow> CREATE TABLE employee_laptop__by_network_utilization (
         timebucket text, 
         checkpoint_time timestamp, 
         employee_id bigint, 
         name text, 
         type text, 
         laptop_id bigint, 
         cpu bigint, 
         memory bigint, 
         network_utilization bigint, 
         disk_utilization bigint, 
         PRIMARY KEY ((timebucket),network_utilization, 
          checkpoint_time,employee_id,laptop_id) 
        ) WITH CLUSTERING ORDER by 
          (network_utilization ASC, checkpoint_time DESC, 
          employee_id ASC, laptop_id ASC); 

插入了一些行之後,我現在可以查詢誰是10月12日經歷了網絡利用率> 50員工/筆記本電腦的組合,2017年

[email protected]:stackoverflow> SELECT * FROm employee_laptop__by_network_utilization 
    WHERE timebucket='20171012' AND network_utilization > 50; 

timebucket | network_utilization | checkpoint_time     | employee_id | laptop_id | cpu | disk_utilization | memory | name  | type 
------------+---------------------+---------------------------------+-------------+-----------+-----+------------------+--------+----------+----------- 
    20171012 |     55 | 2017-10-12 12:30:00.000000+0000 |   1 |   1 | 4 |    62 |  19 | Jebediah |  Pilot 
    20171012 |     55 | 2017-10-12 12:15:00.000000+0000 |   1 |   1 | 19 |    62 |  18 | Jebediah |  Pilot 
    20171012 |     72 | 2017-10-12 12:00:00.000000+0000 |   3 |   3 | 47 |    54 |  13 |  Bob | Scientist 

(3 rows) 

首先,我需要一個好的分區鍵,將的查詢都意義,防止我的分區從綁定的增長。因此,我選擇了一個名爲「日期桶」的timebucket。這樣,我可以將查詢隔離一天,並確保每個查詢都由單個節點提供服務。

接下來,我聚集在network_utilization上,因爲這是該模型主要關注的主要列。它是第一個聚類列,因爲我們不希望在查詢中過濾列的方式提供更多。

checkpoint_time是PRIMARY KEY中的下一列,主要是因爲具有相同timebucketnetwork_utilization的請求可能更適合按時間排序(DESCending)。

最後,我增加了employee_id的唯一性,然後laptop_id,因爲員工可能有多臺筆記本電腦。

現在,我相信你會發現我的解決方案不完全符合你的用例。那是因爲Cassandra的數據建模是非常用以用例爲中心。通常一個好的解決方案不適合另一個。但是,這是獲取數據的一種方法。

0

您不能只在任何列上執行範圍查詢。 cassandra有一些限制。

在cassandra上創建任何模式之前,您必須具體說明您希望執行查詢的方式,否則大部分時間您的模式將無法工作。

要進行一個範圍查詢,如大於,大於等於,小於,小於等於,您需要在模式中指定聚類列。

我們不能簡單地在cassandra中指定Clustering列。您必須在cassandra的每個模式中聲明分區鍵。

要對集羣列進行查詢,您必須傳遞查詢中以前的所有主鍵的值。