首先:我知道在 Cassandra 中进行全面扫描不是一个好主意,但是,目前,这就是我所需要的。
当我开始寻找这样的事情时,我读到人们说不可能在 Cassandra 中进行全面扫描,而且他不是被迫做这种事情的。
不满意,我一直在寻找,直到找到这篇文章: http ://www.myhowto.org/bigdata/2013/11/04/scanning-the-entire-cassandra-column-family-with-cql/
看起来很合理,我试了一下。由于我将只进行一次完整扫描并且时间和性能不是问题,因此我编写了查询并将其放入一个简单的作业中以查找我想要的所有记录。从 20 亿行记录中,我的预期输出是 1000 条左右,但是,我只有 100 条记录。
我的工作:
public void run() {
Cluster cluster = getConnection();
Session session = cluster.connect("db");
LOGGER.info("Starting ...");
boolean run = true;
int print = 0;
while ( run ) {
if (maxTokenReached(actualToken)) {
LOGGER.info("Max Token Reached!");
break;
}
ResultSet resultSet = session.execute(queryBuilder(actualToken));
Iterator<Row> rows = resultSet.iterator();
if ( !rows.hasNext()){
break;
}
List<String> rowIds = new ArrayList<String>();
while (rows.hasNext()) {
Row row = rows.next();
Long leadTime = row.getLong("my_column");
if (myCondition(myCollumn)) {
String rowId = row.getString("key");
rowIds.add(rowId);
}
if (!rows.hasNext()) {
Long token = row.getLong("token(rowid)");
if (!rowIds.isEmpty()) {
LOGGER.info(String.format("Keys found! RowId's: %s ", rowIds));
}
actualToken = nextToken(token);
}
}
}
LOGGER.info("Done!");
cluster.shutdown();
}
public boolean maxTokenReached(Long actualToken){
return actualToken >= maxToken;
}
public String queryBuilder(Long nextRange) {
return String.format("select token(key), key, my_column from mytable where token(key) >= %s limit 10000;", nextRange.toString());
}
public Long nextToken(Long token){
return token + 1;
}
基本上我所做的是搜索允许的最小令牌并逐步进行直到最后一个。
我不知道,但就像这项工作没有完全完成全扫描,或者我的查询只访问了一个节点或其他东西。我不知道我是否做错了什么,或者真的不可能进行全面扫描。
今天我有将近 2 TB 的数据,在一个由七个节点组成的集群中只有一个表。
有人已经遇到过这种情况或有什么建议吗?