2016-12-20 4 views
0

내가 다음 문 사용하여 스파크 카산드라 커넥터를 사용하여 카산드라 테이블을 조회 할 스파크 카산드라 커넥터 사용하여 쿼리 :"누락 EOF"오류 메시지

sc.cassandraTable("citizens","records") 
    .select("identifier","name") 
    .where("name='Alice' or name='Bob' ") 

을 그리고 난이 오류 메시지가 :

org.apache.spark.SparkException: Job aborted due to stage failure: 
Task 0 in stage 81.0 failed 4 times, most recent failure: 
Lost task 0.3 in stage 81.0 (TID 9199, mydomain): 
java.io.IOException: Exception during preparation of 
SELECT "identifier", "name" FROM "citizens"."records" WHERE token("id") > ? AND token("id") <= ? AND name='Alice' or name='Bob' LIMIT 10 ALLOW FILTERING: 
line 1:127 missing EOF at 'or' (...<= ? AND name='Alice' [or] name...) 

은 내가 잘못 여기서 뭐하는 거지 어떻게 내가 커넥터의 where 절을 사용하여 or 쿼리를 만들 수 있습니까?

답변

1

OR 절이 유효한 CQL이 아닙니다. 이 몇 가지 핵심 값 (나는 name이 열쇠라고 가정한다)의 경우 IN 절을 사용할 수있다.

.where("name in ('Alice', 'Bob') ") 

where 절은 이렇게에만 유효 CQL이 그 안에 갈 수 아래로 CQL 카산드라에 밀어하는 데 사용됩니다. Spark Side Sql-Like 구문을 수행하려는 경우 SparkSql 및 Datasets를 확인하십시오.

+0

실제로'name'은 기본 키가 아니며 테이블의 일부 열입니다. 'LIMIT 10 ALLOW FILTERING : 비 기본 키 열 (name)에있는 술어가 아직 지원되지 않습니다. '라는 제안을 실행할 때이 오류 메시지가 나타납니다. 'name'의 값은 고유하지 않습니다. 'name' 필드를 공유하는 많은 다른 엔트리가 있습니다. 이것에 대한 커넥터를 활용하는 다른 방법이 있습니까? 아니면 SQL이 할 수있는 유일한 방법입니까? – Mnemosyne

+0

이름이 임의의 열일 경우 커넥터는이 테이블을 완전히로드하는 데 사용됩니다. 커넥터가 Spark보다이 값을 더 효율적으로 찾을 수있는 방법은 없습니다. "In values"세트가 충분히 큰 경우 다양한 스파크 조인을 조사해야합니다. – RussS

+0

그래, 이제 이것이 커넥터의 범위 밖에 있다는 것을 이해했습니다. 고맙습니다! – Mnemosyne