我对 No SQL 解决方案还是个新手,几个月前我才开始学习 nosql。
我有一个项目,它是由 Spring Boot 框架构建的,并且有一个 DAO 层。我的数据库是 cassandra,我使用 datastax java cassandra 驱动程序进行通信。我发现 cassandra 或所有 nosql 键/值解决方案都不支持区分大小写和使用“like%”用例进行查询。在通过 stackoverflow 和其他论坛进行了一些研究后,发现必须使用 apache Spark、Elastic Search 或 apache lucene 等工具来挖掘 cassandra 中的数据。所以我选择了apache Spark,但我不确定代码是否应该以这种方式完成(就最佳实践而言)。
这是我查询数据的代码:
@Override
public Login getLoginByEmail(String shopId, String email) throws InterruptedException, ExecutionException {
JavaFutureAction<List<Login>> loginRDDFuture = javaFunctions(getSparkContext())
.cassandraTable("shop_abc", "app_login", loginRowReader)
.filter(new Function<Login, Boolean>() {
private static final long serialVersionUID = 1L;
@Override
public Boolean call(Login login) throws Exception {
return login.getEmail().equalsIgnoreCase(email.trim());
}
}).collectAsync();
List<Login> lgnList = loginRDDFuture.get();
if(lgnList.size() > 0){
return lgnList.get(0);
}
return null;
}
我花了9秒才得到结果,数据库只有一张表和3条记录。我想如果数据库超过一百万条记录会发生什么。
我不确定这是否是好的做法,或者有更好的方法或更好的工具来做到这一点,我希望有人能给我指导。
欣赏。
最佳答案
我认为这种查询会相当慢,因为它必须从 C* 数据库中检索所有数据,按标记范围分解查询并将它们映射到 RDD,然后使用 Spark 作业对它们进行过滤。即使您的数据集很小,这也会产生一些开销,尽管 9 秒看起来确实很长,但如果不了解更多关于您的环境的信息,很难知道为什么。
或者,您是否考虑过使用 SSTable Attached Secondary Indices (SASI) ? SASI 是在 C* 3.4 中引入的,允许您使用 cassandra 执行 LIKE %
查询,区分大小写或不区分大小写,即:
CREATE CUSTOM INDEX fn_suffix_allcase ON cyclist_name (firstname)
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {
'mode': 'CONTAINS',
'analyzer_class':'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer',
'case_sensitive': 'false'
};
关于 SASI 的一个很好的引用演讲是 SASI: Cassandra on the Full Text Search Ride .
关于java - 在 Java 中使用 apache Spark 查询 cassandra 时速度很慢。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41668078/