Datastax Java Driver无法扫描整个表

时间:2018-01-21 07:10:22

标签: cassandra datastax-java-driver cassandra-3.0

我遍历整个表并收到的分区少于预期。 最初,我认为它一定是我的错误,但在检查了每一行的存在(我有一个与我使用的数十亿键的列表)后,通过使用简单的查询,并验证预期的数字与火花连接器,我得出结论,它不能是驱动器以外的任何东西。

我有数十亿的数据行,但收到​​的资源减少了5亿。

其他人遇到过这个问题并且能够解决它吗?

添加代码段

表的结构是一个简单的计数器表,

CREATE TABLE counter_data (
  id text,
  name text,
  count_val counter,
  PRIMARY KEY (id, name)
) ;

公共类CountTable {

private Session session;
private Statement countQuery;
public void initSession(String table) {
    QueryOptions queryOptions = new QueryOptions();
    queryOptions.setConsistencyLevel(ConsistencyLevel.ONE);
    queryOptions.setFetchSize(100);
    QueryLogger queryLogger = QueryLogger.builder().build();
    Cluster cluster = Cluster.builder().addContactPoints("ip").withPort(9042)
            .build();
    cluster.register(queryLogger);
    this.session = cluster.connect("ks");
    this.countQuery = QueryBuilder.select("id").from(table);
}


public void performCount(){
    ResultSet results = session.execute(countQuery);
    int count = 0;
    String lastKey = "";
    results.iterator();
    for (Row row : results) {
        String key = row.getString(0);
        if (!key.equals(lastKey)) {
            lastKey = key;
            count++;
        }
    }
    session.close();
    System.out.println("count is "+count);
}
public static void main(String[] args) {
    CountTable countTable = new CountTable();
    countTable.initSession("counter_data");
    countTable.performCount();
}

}

1 个答案:

答案 0 :(得分:0)

检查代码后,请求的一致性级别为1,与RDBMS世界中的脏读取相比。

  

queryOptions.setConsistencyLevel(ConsistencyLevel.ONE);

为了更强一致性,即返回所有记录使用local_quorum。按如下所示更新您的代码

  

queryOptions.setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM);

local_quorum保证副本中的大多数节点(在您的情况下为3个中的2个)响应读取请求,因此更强一致性,从而产生准确的行数。以下是consistency.

的文档参考