Как фильтровать данные в Кассандре? - PullRequest
5 голосов
/ 23 сентября 2010

Я уже некоторое время использую mySQL для приложения, и чем больше данных я собираю, тем медленнее они становятся. Поэтому я изучал параметры NOSQL. Одна из вещей, которые у меня есть в mySQL - это View, созданный из нескольких соединений. Приложение отображает всю важную информацию в сетке, и пользователь может выбирать диапазоны, выполнять поиск и т. Д. На этом наборе данных. Стандартный Query материал.

Глядя на Cassandra, все уже отсортировано на основе параметров, которые я предоставляю в своем хранилище-conf.xml. Таким образом, я бы использовал определенную строку в качестве моего ключа в SuperColumn и сохранял кучу данных в столбцах ниже этого. Но я могу сортировать только по одному столбцу, и я не могу выполнять настоящий поиск в столбцах, не извлекая все SuperColumns и не просматривая данные, верно?

Я не хочу дублировать данные в разных семействах Column, поэтому я хочу убедиться, что Cassandra подходит для меня. В Facebook, Digg, Twitter у них много функций поиска, поэтому, возможно, я просто не вижу решения.

Есть ли способ с Cassandra для меня искать или фильтровать определенные значения данных в SuperColumn или связанных с ним столбцах? Если нет, есть ли другой вариант NOSQL?

В приведенном ниже примере кажется, что я могу только запросить phatduckk, friend1, John и т. Д. Но что, если я захочу найти кого-нибудь в семье ColumnFame, живущей в городе == "Беверли-Хиллз"? Можно ли это сделать без возврата всех записей? Если да, могу ли я выполнить поиск по городу == "Беверли-Хиллз" И штату == "CA"? Похоже, я тоже не могу, но я хочу убедиться, что у меня есть варианты.

AddressBook = { // this is a ColumnFamily of type Super
  phatduckk: {    // this is the key to this row inside the Super CF
    friend1: {street: "8th street", zip: "90210", city: "Beverley Hills", state: "CA"},
    John: {street: "Howard street", zip: "94404", city: "FC", state: "CA"},
    Kim: {street: "X street", zip: "87876", city: "Balls", state: "VA"},
    Tod: {street: "Jerry street", zip: "54556", city: "Cartoon", state: "CO"},
    Bob: {street: "Q Blvd", zip: "24252", city: "Nowhere", state: "MN"},
  }, // end row
  ieure: {     
    joey: {street: "A ave", zip: "55485", city: "Hell", state: "NV"},
    William: {street: "Armpit Dr", zip: "93301", city: "Bakersfield", state: "CA"},
  },

}

Ответы [ 4 ]

6 голосов
/ 23 сентября 2010

Вы «не хотите дублировать данные в разных семействах Column», но именно так вы делаете запрос такого рода в Cassandra.Смотри http://maxgrinev.com/2010/07/12/do-you-really-need-sql-to-do-it-all-in-cassandra/

5 голосов
/ 23 сентября 2010

Вы не можете выполнять такие операции в Кассандре. Есть определенные виды предикатов выбора , которые могут быть установлены для ключей столбцов, но не для значения, которое они содержат. Посмотрите на API и проверьте типы запросов get_slice / get_superslice и get_range. Опять же, все это касается ключей в ColumnFamily или SuperColumnFamily, а не значений.

Если вы хотите описать функциональность, которую вы описали, тогда вам лучше всего использовать базу данных SQL. Создайте правильные индексы для своих таблиц, особенно для наиболее запрашиваемых столбцов, и вы увидите большую разницу в производительности запросов. Надеюсь, это поможет.

0 голосов
/ 25 июня 2012

Обратите внимание, что поскольку вопрос был задан, Cassandra добавила поддержку индексов, автоматически управляемых системой Cassandra (я думаю, начиная с 0.8). Это может ответить на вопрос для некоторых людей вместо управления собственным индексом.

http://www.datastax.com/docs/1.1/dml/using_cli#indexing-a-column

При этом я также хотел упомянуть, что база данных SQL, когда она создает индекс, дублирует большую часть ваших данных для генерации указанного индекса. В Кассандре это все еще очень дешево, особенно потому, что вы можете очень его оптимизировать. Основная проблема заключается в том, что вы должны поддерживать согласованность вручную, что SQL делает для вас прозрачно. Но оба механизма используют одну и ту же теоретическую концепцию.

Это немного похоже на перепрограммирование вашей собственной std :: string со специализациями, относящимися к вашему приложению ... (например, подумайте о QString и CString!)

0 голосов
/ 30 сентября 2011

Суперсемейство не поддерживает вторичный индекс, но обычное семейство столбцов поддерживает.Используя вторичный индекс, вы можете использовать инструкцию GetWhere.

Вот один пример, взятый из одного из моих проектов PHP:

public function GetCodeWithValue( $_value )
{
    $result = $this->getDbFamily()->getWhere(array('value' => $_value, 'used' => 0));

    if ( $this->IsValid( $result ))
        return $result->key();
    else 
        return null;
}

Этот код использует этот API Cassandra: https://github.com/kallaspriit/Cassandra-PHP-Client-Libraryf

...