2017-12-03 23 views
1

테이블의 각 행의 값은 product_id, user_id, updated_at, rating입니다.카산드라의 각 클러스터링 키의 마지막 두 레코드를 가져 오기 위해 스키마를 어떻게 디자인해야합니까?

주어진 기간 동안 얼마나 많은 사용자가 rating을 변경했는지 알아보기 위해 표를 만들고 싶습니다. 난 단지 주어진 시간 창에서 각 사용자의 마지막 두 행을 얻을 수있는 방법을 알아낼 수 없었다

CREATE TABLE IF NOT EXISTS ratings_by_product (
    product_id int, 
    updated_at timestamp, 
    user_id int, 
    rating int, 
    PRIMARY KEY ((product_id ), updated_at , user_id)) 
WITH CLUSTERING ORDER BY (updated_at DESC, user_id ASC); 

만 : 같은

현재 내 스키마 보인다.

쿼리 또는 스키마 변경에 대한 조언을 보내 주시면 감사하겠습니다.

답변

0

카산드라는 테이블 디자인에 대한 쿼리 기반 접근 방식이 필요합니다. 이는 일반적으로 하나의 테이블이 하나의 쿼리를 제공한다는 것을 의미합니다.

CREATE TABLE ratings_by_user_by_time (
    product_id int, 
    updated_at timestamp, 
    user_id int, 
    rating int, 
    PRIMARY KEY ((user_id ), updated_at, product_id)) 
WITH CLUSTERING ORDER BY (updated_at DESC, product_id ASC); 

그런 다음 당신이 사용자에 대한 마지막 두 업데이트 등급을 얻을 수있을 것입니다 : 그래서 당신은 특별히 서비스를 제공하기위한 테이블을 구축해야합니다 (사용자 당 마지막 두 업데이트 행)에 대해 얘기 쿼리를 제공합니다 다음을 수행하여 : 당신이 동기화 자신을 두 등급 테이블을 유지해야합니다

SELECT * FROM ratings_by_user_by_time 
WHERE user_id = 'Bob' LIMIT 2; 

주 및 배치 문을 사용하여 해당 작업을 수행 할 수있는 좋은 방법입니다.

+0

감사합니다. Aaron, 추가 쿼리를 실행하지 않는 한 어떤 사용자가 특정 제품을 평가했는지 알 수없는 문제가 있습니다. 귀하의 테이블에 또 다른 문제가있을 수 있습니다 주어진 제품의 모든 사용자의 마지막 2 등급 대신 지정된 사용자가 모든 제품 등급을 획득 할 수 있습니까? – Harrison

+0

@Harrison 죄송합니다. 사용자의 최근 2 평가를 원한다고 생각합니다. 하지만 시간 범위에 따라 * ALL * 사용자에 대한 마지막 2 등급을 원합니다 ... 그렇지 않습니까? 예, CQL만으로는 불가능합니다. Spark와 같은 것을 사용하여 하위 쿼리를 수행해야하는 것처럼 들립니다. – Aaron