2017-01-16 2 views
1

Я все еще новичок в решении SQL, и я только начинаю изучать nosql с нескольких месяцев назад.Медленно при запросе cassandra с искривлением apache в Java.

У меня есть проект, и он был создан весенней платформой загрузки и имеет слой DAO. Моя база данных была cassandra, и я использую драйвер datastax java cassandra для общения. Я нашел cassandra или, возможно, все решения nosql key/value не поддерживают чувствительность к регистру и запросы с примерами использования «как%». После проведения некоторых исследований через stackoverflow и других форумов, выясните, что им нужно использовать некоторые инструменты, такие как apache spark, эластичный поиск или apache lucene, чтобы выкапывать данные в cassandra. Так что я выбрал искру apache, и я не уверен, должен ли код быть выполнен таким образом (с точки зрения лучшей практики).

Вот мой код для запроса данных:

@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 записей. Я бы подумал, что произойдет, если в базе данных будет более миллиона записей.

Я не уверен, является ли это хорошей практикой или у нее есть лучший способ или лучшие инструменты для этого, я надеюсь, что кто-то может дать мне руководство.

Цените.

ответ

0

Я думаю, что такой запрос будет довольно медленным, поскольку он должен извлекать все данные из вашей базы данных C *, разбивать запросы на диапазоны токенов и сопоставлять их с RDD, а затем фильтрует их с помощью искрового задания. Это будет иметь некоторые накладные расходы, даже если ваш набор данных невелик, хотя 9 секунд кажется довольно продолжительным, но трудно понять, почему, не зная больше о вашей среде.

Альтернативно, вы считаете, что используете SSTable Attached Secondary Indices (SASI)? SASI был введен в C * 3.4 и позволяет делать 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: Cassandra on the Full Text Search Ride.

+1

Просто загляните в SASI несколько минут назад. Похоже, моя проблема может быть решена этим предложением. Я буду реализовывать это, поскольку он был частью кассандры, и мне не нужно вводить так много сторонней библиотеки. Я искал через google и почти прочитал все предложения, но не их представил. Спасибо @ Энди Толберт – A1ucard