我遍历整个表并收到的分区少于预期。 最初,我认为它一定是我的错误,但在检查了每一行的存在(我有一个与我使用的数十亿键的列表)后,通过使用简单的查询,并验证预期的数字与火花连接器,我得出结论,它不能是驱动器以外的任何东西。
我有数十亿的数据行,但收到的资源减少了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();
}
}
答案 0 :(得分:0)
检查代码后,请求的一致性级别为1,与RDBMS世界中的脏读取相比。
queryOptions.setConsistencyLevel(ConsistencyLevel.ONE);
为了更强一致性,即返回所有记录使用local_quorum。按如下所示更新您的代码
queryOptions.setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM);
local_quorum保证副本中的大多数节点(在您的情况下为3个中的2个)响应读取请求,因此更强一致性,从而产生准确的行数。以下是consistency.
的文档参考