2010-08-20 2 views
7

У меня есть Cassandra ColumnFamily (0.6.4), который будет иметь новые записи от пользователей. Я хотел бы запросить Cassandra для этих новых записей, чтобы я мог обрабатывать эти данные в другой системе.Как запросить Cassandra по дате

Мое мнение состояло в том, что я могу использовать TimeUUIDType в качестве ключа для своей записи, а затем запрашивать KeyRange, начинающийся либо с «» как с startKey, либо с каким бы то ни было последнимStartKey. Это правильный метод?

Как get_range_slice действительно создает диапазон? Разве он не должен знать тип данных ключа? В любом месте нет объявления типа данных ключа. В файле storage_conf.xml вы указываете тип столбцов, но не ключей. Предполагается ли, что ключ того же типа, что и столбцы? Или это делает какое-то волшебное нюхание, чтобы догадаться?

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

Любые указатели в этом случае будут оценены.

ответ

2

При сортировке данных важны только столбцы-ключи. Данные, хранящиеся в данных, не имеют никакого значения, и это не автоматическая генерация метки времени. Атрибут CompareWith здесь важен. Если вы установите CompareWith как UTF8Type, то ключи будут интерпретироваться как UTF8Types. Если вы установите CompareWith как TimeUUIDType, то ключи автоматически интерпретируются как временные метки. Вам не нужно указывать тип данных. Посмотрите определения SlicePredicate и SliceRange на этой странице http://wiki.apache.org/cassandra/API Это хорошее место для начала. Кроме того, вы можете найти эту статью полезной http://www.sodeso.nl/?p=80 В третьей части или около того он говорит о разрезе, в котором хранятся его запросы и т. Д.

+0

Я понимаю, что вы можете использовать колонки-столбцы для сортировки. Однако, если бы я должен был написать столбец timestamp для каждого элемента в моей коллекции, я бы постоянно писал в одно семейство столбцов, что создавало бы горячую точку. – Doug

+0

Я не понял ваш комментарий. Не могли бы вы рассказать об этом? Что касается клавиш столбца, Cassandra автоматически сортирует весь столбец (суперколонну) на основе ключа (или «name» в соглашении Cassandra), как только вы его сохраните. Кроме того, если бы вы могли разработать немного больше на вашем примере использования, это помогло бы :) –

0

Дага,

Записи одной семьи колонки иногда может создать горячую точку, если вы используете сохраняющий порядок секционирование, но если вы не используете по умолчанию Random секционирования (если подмножество пользователей не создает значительно больше данных, чем все остальные пользователи!).

Если вы отсортированы ваши строк по времени (с использованием сохраняющего порядок секционирования), то вы, вероятно, еще более вероятно, для создания точки доступа, так как вы будете добавлять строки последовательно и один узел будет нести ответственность за каждый диапазон пространство ключей.

0

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

Остерегайтесь использования дат в качестве ключей строк, поскольку даже рандомизация стандартного randompartitioner ограничена, и вы можете в конечном итоге загромождать свои данные.

Более того, если эта дата меняется, вам придется удалить предыдущую строку, так как вы можете делать только вставки в C *.

Вот что мы знаем:

  • Диапазон среза является диапазон столбцов в строке с начальным значением и конечным значением, это используется в основном для широких строк в столбцы упорядочены. Известные имена столбцов, определенные в CF, индексируются, поэтому их можно получить, указав имена.
  • Ключевой срез - это ключ, связанный с диапазоном разрезанных столбцов, возвращаемым Cassandra
  • В эквиваленте предложения where используются вторичные индексы, вы можете использовать там операторы неравенства, однако в нем должно быть хотя бы условие ONE equals в ваше заявление (см. также https://issues.apache.org/jira/browse/CASSANDRA-1599).
  • Использование диапазона ключей неэффективно с помощью Random Partitionner, поскольку хеш MD5 вашего ключа не поддерживает лексический порядок.

То, что вы хотите использовать это индекс столбца семьи, используя широкий ряд: CompositeType (TimeUUID | UserID) Для того, чтобы это не стало жарко, добавить первый значимый ключ («ключ осколка») который будет разделять данные по узлам, таким как тип пользователя или регион.

Имея больше данных, чем необходимо в Кассандре, это не проблема, так оно и должно быть спроектировано, поэтому вы должны спросить себя, «что мне нужно запросить», а затем спроектировать для него семейство колонок, а не пытаться соответствовать все в одном CF, как вы делали бы в РСУБД.