在Java中使用apache spark查询cassandra时速度很慢。

时间:2017-01-16 00:54:42

标签: java apache-spark cassandra

我还是没有SQL解决方案的新手,我几个月前就开始学习nosql了。

我有一个项目,它是由spring boot框架构建的,并且有一个DAO层。我的数据库是cassandra,我使用datastax java cassandra驱动程序进行通信。我发现cassandra或者所有nosql密钥/值解决方案都不支持区分大小写和查询"如%"用例。在通过stackoverflow和其他论坛完成一些研究之后,弄清楚那些必须使用一些工具,如apache spark,弹性搜索或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条记录。我会认为如果数据库超过百万条记录会发生什么。

我不确定这是好的做法还是有更好的方法或更好的工具来做到这一点,我希望有人可以给我一个指导。

欣赏。

1 个答案:

答案 0 :(得分:0)

我认为这种查询会相当慢,因为它必须从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