2014-03-12 3 views
1

데이터 저장소 Cassandra 2.0 드라이버를 사용하고 있으며 준비된 바인딩 문을 가지고 놀고 있습니다. 의 나는 이런 식으로 뭔가를 조회 할 가정 해 봅시다 : UUID1, UUID2, UUID3이 UUID 값입니다카산드라에서 값 집합으로 준비된 문

SELECT * FROM foo WHERE mykey IN (UUID1, UUID2, UUID3); 

. 바운드 구문을 사용하여 프로그래밍 작업을 수행하는 방법은 무엇입니까? 현재 나는 다음의 라인을 따라 뭔가를 시도하고있다 :

preparedStatement = session.prepare("SELECT * FROM foo WHERE vref IN ?") 
boundStatement = new BoundStatement(preparedStatement) 

val uuids: java.util.ArrayList[java.util.UUID] = //assume we're getting the values from somewhere 
session.execute(boundStatement.bind(uuids)) 

이것은 현재 잘못된 결과를 반환하고있다. 쿼리의 형식을 올바르게 지정하는 방법에 대한 제안 사항이 있습니까?

+0

, 당신의 접근 방식은 올바른 것 같다. 어떤 종류의 잘못된 결과가 나타 납니까? 잘못된 행을 다시 얻는다면 이는 아마도 버그 일 것입니다. 예외가 발생하면 살펴볼 내용이 있습니다. 일부 구문 세부 사항을 수정해야 할 수도 있습니다. –

+0

'IN'을 사용할 때는주의해야합니다. 프로덕션 클러스터에서 사용하려는 것은 아닙니다. http://stackoverflow.com/questions/26999098/is-the-in-relation-in-cassandra-bad-for-queries/ – Aaron

답변

1

다음은 간단한 표와 텍스트 값을 사용하는 예입니다. 를 CentOS 6.5 DSE4.5.1 사용

내 테이블 :

DESCRIBE TABLE deleteme1 ; 

CREATE TABLE deleteme1 (
    col1 text, 
    col2 text, 
    PRIMARY KEY ((col1)) 
) WITH 
    bloom_filter_fp_chance=0.010000 AND 
    caching='KEYS_ONLY' AND 
    comment='' AND 
    dclocal_read_repair_chance=0.100000 AND 
    gc_grace_seconds=10000 AND 
    index_interval=128 AND 
    read_repair_chance=0.000000 AND 
    replicate_on_write='true' AND 
    populate_io_cache_on_flush='false' AND 
    default_time_to_live=0 AND 
    speculative_retry='99.0PERCENTILE' AND 
    memtable_flush_period_in_ms=0 AND 
    compaction={'class': 'SizeTieredCompactionStrategy'} AND 
    compression={'sstable_compression': 'LZ4Compressor'}; 

내 데이터 :

cqlsh:results> select * from deleteme1 ; 

col1 | col2 
-------+------- 
three | three 
    one | one 
    two | two 
    four | four 

(4 rows) 

내 샘플 테스트 클래스

import java.util.ArrayList; 

import com.datastax.driver.core.BoundStatement; 
import com.datastax.driver.core.Cluster; 
import com.datastax.driver.core.PreparedStatement; 
import com.datastax.driver.core.ResultSet; 
import com.datastax.driver.core.Session; 


public class PrepStatement { 
    Cluster cluster; 
    Session session; 

    public static void main(String args []){ 
     PrepStatement myTest = new PrepStatement(); 
     String node = "192.168.56.22"; 
     myTest.runTest(node); 
     myTest.close(); 

    } 

    private void runTest(String node){ 
     ArrayList<String> vals = new ArrayList<String>(2); 
     vals.add("one"); 
     vals.add("three"); 

     try { 
      cluster = Cluster.builder() 
        .addContactPoint(node) 
        //.withCredentials("cassandra", "cassandra") // only if you need a login 
        .build(); 
      session = cluster.connect(); 
      PreparedStatement preparedStatement = session.prepare("SELECT * FROM results.deleteme1 WHERE col1 IN ?"); 
      BoundStatement boundStatement = new BoundStatement(preparedStatement); 
      ResultSet results = session.execute(boundStatement.bind(vals)); 
      for (Object result : results){ 
       System.out.println(result.toString()); 
      } 
     } 
     catch (Exception e){ 
      e.printStackTrace(); 
     } 

    } 

    /** 
    * cleans up the session 
    */ 
    private void close() { 
     session.close(); 
     cluster.close(); 
    } 
} 

마지막 .. 여기 출력 :

Row[one, one] 
Row[three, three] 
,451,515,

는 이곳에서만 CQL3.0의 문서에 설명 된대로 기본 키 열입니다 열에서 IN 쿼리를 사용할 수 있습니다 : 난 그냥 몇 가지 관련 원천에서는 http://www.datastax.com/documentation/cql/3.0/cql/cql_reference/select_r.html