Как запросить Кассандру по диапазону дат - PullRequest
8 голосов
/ 21 августа 2010

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

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

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

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

Любые указатели в этом случае приветствуются.

Ответы [ 3 ]

2 голосов
/ 05 сентября 2010

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

1 голос
/ 03 марта 2013

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

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

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

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

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

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

Наличие большего количества данных, чем необходимо в Cassandra, не проблема, это то, кактак что вы должны спросить себя: «что мне нужно сделать запрос», а затем спроектировать семейство столбцов для него?а не пытаться уместить все в одном CF, как вы бы сделали в RDBMS.

1 голос
/ 14 апреля 2011

Doug,

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

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

...