2017-10-12 12 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 

지금, 나는 3.1 카산드라 버전을 사용하고, 그것은

select * from employee where laptoplist.networkutilization > 50; 

참고로 가능 방법 아래와 같이 뭔가를 조회 할. 사전에

감사합니다, 해리

+0

[카산드라 - 비 기본 키 단점이있는 WHERE 절]의 가능한 복제본 (https://stackoverflow.com/questions/35524516/cassandra-where-clause-with-non-primary-key-disadvantages) – muru

답변

2

이 그대로 잘 작동하지 않을. 여기서 원하는 것을 얻는 데 필요한 몇 가지 변경 사항 이상이 있습니다. 카산드라에는 일반적으로 도움이되는 두 가지가 있습니다.

  1. 데이터 모델에 문제가있는 경우 시계열로 보이는 것이 무엇인지 물어보십시오.

Cassandra의 추가 전용 저장 엔진을 사용하면 시계열 및 이벤트 추적과 같은 사용 사례를 쉽게 맞출 수 있습니다. 그리고 때로는 데이터 모델이 (카산드라 관점에서) 그 관점에 맞춰 조정될 때 더 이해가됩니다.

  1. 쿼리 패턴과 일치하도록 테이블을 작성하십시오.

ID의 기본 키를 확인합니다. 그러나 내가 볼 수없는 것은 위의 (적어도) ID를 필터링하는 쿼리입니다. 직원과 랩톱 같은 것이 중요하고 고유 할 수 있다고 말할 수 있습니다. 그러나 고유 키가 항상 최상의 정보 필터를 만드는 것은 아닙니다.

질문 할 질문은 여기에 무엇을하려고합니까?

네트워크 사용률이 높은 사용자를보고 싶습니다. 높은 네트워크 활용도는 (일시적으로) 일시적인 문제이므로 시간 구성 요소를 추가하지 않는 이유는 무엇입니까 (checkpoint_time)? IMO, 시간이 지남에 따라 컴퓨팅 리소스 사용률을 추적하는 것이 좋습니다. 이러한 점을 고려하면,이 같은 데이터 모델을 내놓았다 : 지금 10 월 12 일에 네트워크 활용> (50)을 경험 한 직원/노트북 조합을 조회 할 수있는 몇 가지 행을 삽입 한 후

[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); 

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 같은 timebucketnetwork_utilization에 요청 아마 시간 (내림차순)으로 분류 더 이해하게됩니다 주로하기 때문에, 기본 키의 다음 열입니다.

마지막으로 직원이 둘 이상의 랩톱을 가질 수 있기 때문에 마지막으로 employee_id을 고유성으로 추가 한 다음 laptop_id을 추가했습니다.

이제 유스 케이스에 맞지 않는 내 솔루션의 측면을 발견하게 될 것입니다. 그리고 카산드라 데이터 모델링은 이므로 매우 유스 케이스 중심입니다. 종종 하나의 좋은 해결책은 다른 사람을위한 쿠키 커터 맞춤이 아닙니다. 그러나, 그것은 당신이 겪은 데이터를 얻는 한 가지 방법입니다.

0

모든 열에 대해 범위 쿼리를 수행 할 수는 없습니다. 카산드라에는 몇 가지 제한이 있습니다.

cassandra에서 스키마를 만들기 전에 쿼리를 수행하려는 방식에 따라 구체적으로 지정해야합니다. 그렇지 않으면 대부분의 경우 스키마가 작동하지 않습니다.

스키마에서 클러스터링 열을 지정하는 데 필요한보다 크거나 같음, 작음,보다 작음 등과 같은 범위 쿼리를 수행하려면 다음을 수행하십시오.

단순히 cassandra의 클러스터링 열만 지정할 수 없습니다. cassandra의 모든 스키마에서 파티션 키를 선언해야합니다.

클러스터링 열에 대한 쿼리를 수행하려면 쿼리에서 이전 기본 키의 값을 모두 전달해야합니다.