2014-05-12 3 views
0

이전 중고품 기반 코드를 CQL3으로 업데이트하고 있습니다.varchar 키를 사용하여 CQL3을 사용하여 Cassandra에서 큰 결과를 페이징

코드의 한 부분이 20M + 행으로 구성된 테이블의 전체 데이터 세트를 처리하고 있습니다. 이 부분은 처음에는 메모리 사용으로 인해 프로그램이 손상 되었기 때문에 TokenRanges (및 Hector)를 사용하여 열 패밀리를 반복하는 RowIterator 클래스를 만들었습니다.

CQL3을 사용하여 이것을 다시 쓰려고 할 때 데이터를 페이징하는 데 문제가 있습니다. 나는 http://www.datastax.com/documentation/cql/3.0/cql/cql_using/paging_c.html에서 약간의 정보를 통해 찾았지만, 최초의 "페이지"

resultSet = session.execute("select * from " + TABLE + " where token(key) <= token(" + offset + ")"); 

이 코드를하려고 할 때 나는 오류를

com.datastax.driver.core.exceptions.InvalidTypeException를 얻을 : 잘못된 유형을 가 CQL 형 VARCHAR 값 0, 기대 클래스 java.lang.String하지만 클래스 java.lang.Integer의

부여 제공된 링크의 예는 숫자 키를 사용한다. varchar (UTF8Type) 키를 사용하여이 작업을 수행 할 수 있습니까?

현재이 기능이 내장되어있는 것 같습니다 (https://issues.apache.org/jira/browse/CASSANDRA-4415). 그러나 저에게 도움이되는 예제를 찾을 수 없습니다. 게다가, 나는 지금 Cassandra 1.2.9를 위해 그것을 해결해야만한다.

답변

1

따라서 쉬운 대답은 Cassandra 2.0.X로 업그레이드하고 새로운 내장 페이징 기능을 사용하는 것입니다. 그러나 Cassandra 1.2에서이 작업을 수행하려면 올바른 방향으로 가야합니다. 당신의 구문이 작동해야합니다, 만약 당신이 cqlsh에서 시도하는 쿼리를 실행하면 같은 에러가 나옵니까? 이런 식으로 페이징 할 때 ">"를 사용하는 것이 가장 좋으며, 이는 문제 일 수 있습니다. select * from table limit 100부터 시작하여 select * from table where token(key)>token('last key') limit 100

으로 문의하고 싶습니다. 준비된 진술로 시도해 보겠습니다. 문자열 조작은 오프셋에 재미있는 작업을 수행 중일 수 있습니다.

+0

답변 해 주셔서 감사합니다. 예, 곧 2.0으로 업그레이드 할 예정입니다. 그러나 나는 그 전에이 일을해야합니다. 준비된 문장을 사용하고 있지만 작동 시키려고 할 때 문자열로 전환했습니다. <는 첫 번째 청크에 불과했습니다. 다음으로>를 사용합니다. 그러나 단순한 한계 100이 토큰을 사용할 때와 같은 방식으로 결과를 정렬한다는 사실을 알지 못했습니다. 따라서 초기 쿼리가 더 간단 해집니다. – Moonwalkr

+0

그리고 예, 나는 cqlsh에서 같은 오류 메시지를받습니다. 하지만, 지금 당신의 제안 (...> 토큰 (lastkey) 제한 100)을 시도했을 때 나는 그것을 작동 시켰습니다! 일종의. 행을 놓치고있는 것 같습니다. 기본 키는 키와 열의 합성입니다 1 CLI를 사용하면 "키"(IP 주소) 당 하나의 행만 있고 모든 데이터는 열에 있지만 cqlsh를 사용하면 각 IP에 대해 "행"이 10 개 이상있을 수 있습니다. 그 IP와 나는 다음 chunk를 위해 IP를 사용하고 나머지 cql "rows"(열)은 버려진 다 ... – Moonwalkr

+0

그건 분명히 분명하지 않다. 나는 이것을 내 질문에 대한 대답으로 받아 들일 것이다. 선택 작동) 현재 문제에 대한 새로운 질문을 만듭니다. 감사합니다! – Moonwalkr