Хранение списка ценностей в Кассандре - PullRequest
5 голосов
/ 26 марта 2012

Зависимая от версии

Некоторые ответы на этот вопрос касаются более старых версий Cassandra.Правильный ответ для такого рода проблем зависит от используемой вами версии Cassandra.


У меня есть семейство столбцов профиля, и я хочу сохранить список навыков в каждом профиле.Я не уверен, как это обычно делается на Кассандре.Один из вариантов - хранить сериализованный Thrift или protobuf, но я бы предпочел не делать этого, так как считаю, что Cassandra не знает об этих форматах, и поэтому данные в хранилище данных не будутчеловек читаемый или запрашиваемый через CQL из командной строки.Другое решение, о котором я подумал, - это использовать супер-столбец и поставить навык в качестве ключа с нулевым значением:

skills: {
  'java': '',
  'c++': '',
  'cobol': ''
}

Это хороший способ обработки списков в Cassandra?Я предполагаю, что есть некоторая идиома, о которой я не знаю.Я использую клиентскую библиотеку Astyanax , которая поддерживает только составные столбцы, а не суперстолбцы, и поэтому предложенное мной решение в этом случае показалось бы довольно неудобным.Хотя у меня все еще есть некоторые проблемы с пониманием составных столбцов, поскольку они пока еще не полностью документированы.Будет ли это решение работать с составными столбцами?

Ответы [ 3 ]

4 голосов
/ 26 марта 2012

Этот ответ датируется выпуском Cassandra версии 1.2, которая предоставляла существенно разные функциональные возможности для обработки списков. Ответ может быть неуместным, если вы используете Cassandra 1.2+.


Я бы закодировал списки в ключе столбца, используя составные столбцы с реальным именем столбца в качестве первого измерения, то есть:

row_key -> {
     [column_name; entry1] -> "",
     [column_name; entry2] -> "",
     ... 
}

Затем, чтобы прочитать список, вам нужно сделать get_slice из [column_name; ] до [column_name; ] - обратите внимание на пустые размеры.

Самое замечательное в этом то, что он реализует набор довольно красиво; список не может содержать одно и то же дважды. Я думаю, что Thins работает в вашем случае. Список также будет поддерживаться в отсортированном порядке.

3 голосов
/ 04 июля 2013

В более старых версиях Cassandra вы должны были сами сериализовать список и сохранить его в столбце или, возможно, использовать супер-столбец.

Начиная с версии 1.2 Cassandra , CQL3 имееттипы коллекций для столбцов, поэтому вы можете указать list<text> в качестве типа столбца в вашей схеме.Например:

 CREATE TABLE Person (
    name text,
    skills list<text>,
    PRIMARY KEY (name)
 );

Или вы можете использовать set<text>, если хотите автоматически удалять дубликаты.

3 голосов
/ 28 марта 2012

Этот ответ датируется выпуском Cassandra версии 1.2, которая предоставляла существенно разные функциональные возможности для обработки списков.Ответ может быть неуместным, если вы используете Cassandra 1.2 +.


Как уже упоминалось в списке рассылки, я предпочел бы, чтобы один столбец «навыки» был сохранен сзначение является сериализованной строкой JSON.

Действительно сводится к шаблонам использования, которые вы используете для «навыков».

  • Если «навыки» предназначены только для CRUD для каждого пользователя, это нормально.
  • Если вы хотите иметь возможность искать всех пользователей, обладающих навыком «кобол», то я все равно рекомендовал бы этот подход и получил бы еще одну строку , то есть навык: кобол, имеющийстолбец UUID и значение метки времени или что-то подобное ...
  • Я уверен, что с интеграцией Pig / Hadoop с вашими узлами cassandra вы также могли бы с удовольствием отправлять запросы всем пользователям, у которых есть x,y и z для создания новых данных для поддержки дополнительных вариантов использования.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...