2015-01-05 2 views
1

내가 같은 테이블이 있다고 가정하자 :SparkSQL - 컬렉션 (설정)에 CassandraSqlContext 쿼리

CREATE TABLE USER (
    userid ascii, 
    books set<text> 
    PRIMARY KEY (userid) 
); 

및 지수 :

create index on USER (books); 

나는 SQL 컨텍스트를 사용하여 책을 조회 할. 내가 뭐하는 거지 것은 :

CassandraSQLContext cassandraContext = new CassandraSQLContext(sparkContext); 
SchemaRDD userTable = cassandraContext.sql("SELECT * FROM keyspace.user"); 
userTable.registerTempTable("usertable"); 

다음 쿼리는 카산드라에 대한 하지 작업을 수행합니다

그것은 단지 'BOOK1'을 사용자에게 반환
SchemaRDD userTable = cassandraContext.sql("SELECT * FROM keyspace.user where books CONTAINS 'book1' and books CONTAINS 'book2'"); 

. books CONTAINS ('book1', 'book2')과 비슷한 쿼리를 시도했지만 그 중 아무 것도 작동하지 않았습니다.

은 내가 등록 테이블에 할 수있는 것은 :

SchemaRDD users = cassandraContext.sql("SELECT * FROM usertable where books IN ('book1', 'book2')"); 

또는 유사한 쿼리 :

SchemaRDD users = cassandraContext.sql("SELECT * FROM usertable where userid='some_user_id'"); 

내가하고 싶은 것은 같은 책에 의해 쿼리입니다.

하지만 작동하지 않습니다. 0 개의 레코드를 반환합니다. 나는 user_books_idx이라는 이름의 인덱스 테이블을 등록하려고 시도했으나 어느 것도 작동하지 않았습니다. 인덱싱 된 콜렉션에서 쿼리 할 수 ​​있습니까? 내가 어떻게 해?

답변

1

CONTAINS 절은 명령문 당 하나의 값으로 만 작동하므로 한 번에 두 개의 서로 다른 CONTAINS 절을 함께 사용할 수 없을 수도 있습니다.

CONTAINS 'book1'을 사용하여 하나의 RDD를 만든 다음 CONTAINS 'book2'를 사용하여 다른 RDD를 만든 다음 두 개의 RDD를 userid 필드에 조인합니다. 그러면 book1과 book2가 모두 책 세트에있는 사용자의 RDD가 생성됩니다.

+0

그게 내가 지금하고있는 일이지만 그 종류의 천천히. 나는 그것의 가능한 cql 알고 있지만 일부 조인 절을 SQL 컨텍스트에서 할 기대했다. –

+0

안녕하세요 @ MustafaGenç .. 나는 비슷한 문제가 ..이 CassandraRow .. 대신 JOINs schemaRDD 임시 테이블을 사용하여 GenericRow 얻을. – monal86