java - 在 Java 中使用 apache Spark 查询 cassandra 时速度很慢。

标签 java apache-spark cassandra

我对 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/

相关文章:

java - 如何在camel中实现路由以从JMS队列接收消息?

apache-spark - Spark SQL 的哪一部分解析 SQL 语句并创建执行计划?

scala - 编写在 Scala 中调用泛型函数的泛型函数

cassandra - 错误请求 : line 1:115 mismatched input ';' expecting K_VALUES in cassandra

c++ - 使用 datastax c++ 驱动程序将大型二进制文件或数组(超过 64MB)插入 Cassandra

java - 不同初始容量和负载因子的HashMap性能

java - 获取两个 DateTimes 之间的差异作为 DateTime 对象?

java - ImageIO.write 不工作?

python - 如何将 PyCharm 与 PySpark 链接?

cassandra - 关闭 Cassandra 服务器,然后在 Windows 7 中重新启动它