2013-07-05 39 views
3

我正在使用Cassandra 1.2.5和二级索引。当我运行准备语句时,没有数据返回。我有数据。也为索引列我有重复的值。我正在做的是根据user_id重新调整video_id列表。表格描述如下: [default @ video]描述视频;Cassandra Datastax驱动程序没有通过返回行准备

警告:CQL3表格有意从'describe'输出中省略。 有关详细信息,请参阅https://issues.apache.org/jira/browse/CASSANDRA-4377

ColumnFamily: videos 
    Key Validation Class: org.apache.cassandra.db.marshal.IntegerType 
    Default column value validator: org.apache.cassandra.db.marshal.IntegerType 
    Columns sorted by: org.apache.cassandra.db.marshal.UTF8Type 
    GC grace seconds: 864000 
    Compaction min/max thresholds: 4/32 
    Read repair chance: 0.1 
    DC Local Read repair chance: 0.0 
    Populate IO Cache on flush: false 
    Replicate on write: true 
    Caching: ALL 
    Bloom Filter FP chance: default 
    Built indexes: [videos.videos_user_id_idx] 
    Column Metadata: 
    Column Name: video_id 
     Validation Class: org.apache.cassandra.db.marshal.IntegerType 
    Column Name: user_id 
     Validation Class: org.apache.cassandra.db.marshal.IntegerType 
     Index Name: videos_user_id_idx 
     Index Type: KEYS 
    Compaction Strategy: org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy 
    Compression Options: 
    sstable_compression: org.apache.cassandra.io.compress.SnappyCompressor 

我的代码如下所示: int concurrency = 3; // final BoundStatement query = null; 尝试创建会话到主机 Cluster cluster = new Cluster.Builder()。addContactPoints(String.valueOf(“localhost”))。build();

  // final int maxRequestsPerConnection = 10; 
      // int maxConnections = concurrency/maxRequestsPerConnection + 1; 

      int maxConnections = 3; 
      PoolingOptions pools = cluster.getConfiguration().getPoolingOptions(); 
      pools.setMaxSimultaneousRequestsPerConnectionThreshold(HostDistance.LOCAL, concurrency); 
      pools.setCoreConnectionsPerHost(HostDistance.LOCAL, maxConnections); 
      pools.setMaxConnectionsPerHost(HostDistance.LOCAL, maxConnections); 
      pools.setCoreConnectionsPerHost(HostDistance.REMOTE, maxConnections); 
      pools.setMaxConnectionsPerHost(HostDistance.REMOTE, maxConnections); 


      Session session = cluster.connect(); 


      //get list of video ids 
      String cql1 = "SELECT video_id from video.videos WHERE user_id=?"; 
      com.datastax.driver.core.PreparedStatement stmt = session.prepare(cql1); 
      BoundStatement b = stmt.bind(); 
      BigInteger i = BigInteger.valueOf(9); 
      b.setVarint("user_id",i); 
      long start, end;     
      start = System.nanoTime(); 
      com.datastax.driver.core.ResultSet rs1 = session.execute(b); 
      end = System.nanoTime(); 
      System.out.println("Datastax driver CQL Query prepared overall time ns:" 
        + (end - start)); 

      while(rs1.iterator().hasNext()) { 
       System.out.println("user_id:" + rs1.iterator().next().getVarint("video_id")); 
      } 

请注意,即使我更改语句以替换?值为9我仍然没有返回行。

任何想法我做错了什么?

感谢, 托尼

回答

1

试试这个代码检索数据:

Cluster cluster = Cluster.builder() 
           .addContactPoint("127.0.0.1") 
           // .addContactPoint("some.other.ip") 
           .build(); 
Session session = cluster.connect(); 

String statement = "SELECT * FROM pixel.user;"; 
// String statement = "SELECT video_id from video.videos WHERE user_id=9"; 

session.execute(statement); 
ResultSet rs = session.execute(statement); 
for(Row r : rs.all()) 
    System.out.println(r.toString()); 

一旦你得到了基本下跌,其时间绑定声明:

int user_id = 9; 
String statement = "SELECT * from video.videos WHERE user_id=?"; 
PreparedStatement pStatement = session.prepare(statement); 
BoundStatement boundStatement = new BoundStatement(pStatement); 

PreparedStatement ps = session.prepare(statement); 
BoundStatement bs = ps.bind(); 
bs.bind(user_id); // a csv list: bs.bind(9, "string val of second ?, etc..."); 

// session.execute(bs); 
ResultSet rs = session.execute(bs); 
相关问题