2015-01-14 2 views
3

내가 좋아하는 구조화 된 테이블에 어떤 범위 쿼리를 실행할 : I를 Performing range queries for cassandra table 지금 : 나는 배 부르게 게시물을 읽을카산드라 ByteOrderedPartitioner

SELECT num, val1, val2 FROM table WHERE num>100 AND num<1000; 

: 범위 쿼리처럼 보일 것입니다

CREATE TABLE table(

num int, 
val1 int, 
val2 float, 
val3 text, 
... 
PRIMARY KEY(num) 
) 

을 ByteOrderedPartitoner 사용에 문제가 있습니다.

OPSCenter 웹 인터페이스를 사용하고 새 클러스터를 작성하십시오. 나는 파티션 설정을 변경하고 다음과 같은 오류 메시지가 나타납니다

오류 비전 클러스터를 : 양식의 token_map 인수 : RandomPartitioner를 사용하지 않거나 Murmur3Partitioner

나는 token_map 인수를 찾을 수 없을 때 {IP 토큰이} 필요합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 쿼리를 활성화하려면 내가해야 할 일이 무엇입니까?

누군가가 나를 도울 수 있기를 바랍니다. 고맙습니다!

답변

8

내가 뭘 잘못하고 있니?

사용자는 Byte Ordered Partitioner를 사용하고 있습니다. 그 사용은 카산드라의 안티 패턴으로 확인되었습니다 ... 잠시 동안. 매트 데니스는 slideshare presentation on Cassandra Anti-Patterns을 가지고 있으며, 그것은 BOP에 관한 슬라이드 포함 : 위의 슬라이드는 유머로 의미있는 동안 Don't use the Byte Ordered Partitioner

그래서, 심각, 바이트 정렬 된 파티션 설정을 사용하지 않는합니다. 그것은 여전히 ​​카사 라 (Cassanra)에 포함되어있어 2011 년에 다시 사용했던 사람들은 업그레이드 경로를 가지고 있습니다. 새 클러스터를 BOP와 함께 빌드해야합니다. Murmur3 파티셔 (기본값)를 사용해야합니다.

Murmur3 파티셔너로 문제를 해결하는 방법은 위의 질문/답변에서 Patrick McFadin의 Getting Started With Time Series Data Modeling 기사를 참조하십시오. 이 기사에는 3 가지 모델링 패턴이 설명되어 있습니다. 그들은 적절한 데이터 모델을 제시 할 수 있어야합니다. 기본적으로 클러스터링 키로 데이터를 정렬 한 다음 범위 쿼리로 읽을 수 있습니다. 현재 파티션 키가 아닙니다.

CREATE TABLE tableorderedbynum(
num int, 
val1 int, 
val2 float, 
val3 text, 
someotherkey text, 
... 
PRIMARY KEY((someotherkey),num) 
); 

데이터 모델을 검사하고 데이터를 분할하는 데 도움이되는 다른 키를 찾을 수 있는지 확인하십시오. 그런 다음 다른 키를 파티션 키로 사용하고 클러스터링 키로 num을 사용하여 조회 테이블을 작성한 경우 (위에서와 같이). 다음이 범위 쿼리가 작동합니다 : 바이트 순서 파티션 설정을 사용하여

SELECT num, val1, val2 
FROM tableorderedbynum WHERE someotherkey='yourvalue' AND num>100 AND num<1000; 
+3

이 대답에 +1이 충분하지 않습니다. – RussS

+0

정말 고마워요! – Friedrich

+2

오, 안돼 ... 충분하지 않습니다. "내가 도대체 ​​뭘 잘못하고있는 겁니까?"당신이하는 일이 잘못되었습니다."브릴리언트. – ashic

0

확실히 카산드라의 안티 - 패턴입니다,하지만 당신은 여전히 ​​앞서 그것으로 가고 싶은 경우에, 당신은 이상의 범위 쿼리의 위의 기능을 달성 할 수 파티션 키는 토큰 기능을 사용합니다.

SELECT num, val1, val2 FROM tableorderedbynum WHERE someotherkey = 'yourvalue' AND 
token(num) > token(100) AND token(num) < token(1000); 

알려드립니다 유사한 쿼리는 토큰의 순서대로 발생하지만, 본질적으로 무작위되지 않기 때문에 임의의 파티션 설정 또는 Murmur3 파티션 설정을 사용할 때 원하는 결과를 제공하기 위해 실패합니다.