2016-11-02 2 views
5

데이터 중복 제거를 수행하는 ETL 작업 중에 카산드라를 중간 저장소로 고려하고 있습니다.카산드라의 각 파티션 키에 대한 첫 번째 행 가져 오기

이벤트 스트림이 있고 각각 비즈니스 엔티티 ID, 타임 스탬프 및 일부 값이 있다고 가정 해 보겠습니다. 각 비즈니스 키의 인 - 이벤트 타임 스탬프와 관련하여 최신 값만 가져와야하지만, 이벤트는 정렬되지 않을 수 있습니다. 내가 어떤 주어진 파티션에 대한 최신 가치를 얻을 수있는이 테이블의 일부 데이터를 삽입하는 경우 지금

CREATE TABLE sample_keyspace.table1_copy1 (
id uuid, 
time timestamp, 
value text, 
PRIMARY KEY (id, time) 
) WITH CLUSTERING ORDER BY (time DESC) 

:

내 생각은 클러스터링 키와 파티션 키와 타임 스탬프로 비즈니스 ID로 스테이징 테이블을 만드는 것이 었습니다 키.

select * from table1 where id = 96b29b4b-b60b-4be9-9fa3-efa903511f2d limit 1; 

하지만 그건 내가 관심이있는 모든 비즈니스 키 같은 쿼리를 실행하기 위해 필요

내가 할 수있는 몇 가지 효과적인 방법이 있나요 CQL에서?

우리는 사용 가능한 모든 파티션 키를 나열 할 수있는 기능을 알고 있습니다 (select distinct id from table1). 따라서 카산드라의 스토리지 모델을 살펴보면 각 파티션 키의 첫 번째 행을 얻는 것이 너무 어렵지 않아야합니다.

지원되는가요?

답변

13

3.6 이후의 버전을 사용하는 경우 PER PARTITION LIMIT (CASSANDRA-7017)이라는 검색어에 1으로 설정할 수있는 옵션이 있습니다. 이는 cqlsh에서 3.10까지 CASSANDRA-12803으로 자동 완성되지 않습니다.

SELECT * FROM table1 PER PARTITION LIMIT 1; 
0

단어 : 아니요.

파티션 키는 Cassandra가 본질적으로 모든 양의 데이터를 처리 할 수있는 이유입니다. 파티션 키의 해시를 사용하여 데이터를 넣거나 찾고자하는 위치를 결정합니다. 그래서 CQL SELECT는 항상 전체 파티션 키에 대해 평등 필터를 수행해야합니다. 각 id에 대해 처음으로 time을 찾으려면 Cassandra가 모든 노드에 데이터의 파티션을 묻는 메시지를 보내야합니다. 다음은 각각에 대해 복잡한 작업을 수행해야합니다. 관계형 데이터베이스는 이것을 허용하지만 Cassandra는 그렇지 않습니다. 허용되는 것은 전체 테이블 스캔 (SELECT * from table1) 또는 파티션 스캔 (SELECT DISTINCT id FROM table1)이지만 복잡한 작업에는 연결할 수 없습니다.

*) 여기서는 ALLOW FILTERING을 생략합니다.이 문맥에서는 도움이되지 않습니다.

관련 문제