Cassandra Murmur3Распределение порядка строк

У меня есть следующая структура таблицы Cassandra:

CREATE TABLE example.posts (
    name text,
    post_topic text,
    post_date timeuuid,
    post_text text,
    PRIMARY KEY (name, post_topic, post_date)
) WITH CLUSTERING ORDER BY (post_topic ASC, post_date ASC)

Мой ключ раздела name и ключ кластеризации post_topic, post_date,

Мне нужно перебрать все элементы в таблице, чтобы я выполнил запрос SELECT * FROM posts и получить данные обратно следующим образом.

   name | post_topic | post_date                            | post_text
   tom  |  cassandra | 86feab80-710d-11e7-898a-176eb9e01b3a |        hi
   tom  |  cassandra | 8a4dd680-710d-11e7-898a-176eb9e01b3a |       bye
   john |  cassandra | 930ee570-710d-11e7-898a-176eb9e01b3a |  whats up

Я использую Murmur3Partitioner.

Если я хочу перебрать все элементы в таблице и обработать их в первом коде name могу ли я полагаться на все ряды для одного и того же name приходя один за другим (например, tom, tom, john, и не tom, john, tom?

По словам Кассандры It is important to understand that the order in which partitioned rows are returned, depends on the order of the hashed token values and not on the key values themselves.

Если бы у меня было 2 ключа секционирования, которые генерируют один и тот же токен, то я мог бы перепутать строки для разных имен? то есть если бы Том и Джон сгенерировали один и тот же токен, я бы вернулся tom, tom, john или это может быть перепутано как tom, john, tom,

2 ответа

Разное имя будет генерировать другой токен, Murmur3Partitioner удостоверится в этом.

Cassandra хранит всю вашу группу данных по ключу раздела. Кассандра будет хранить ваши данные, как показано ниже:

------------------------------------------------------------------------------------------------------------------|
|   tom   |  cassandra : 86feab80-710d-11e7-898a-176eb9e01b3a  | cassandra : 8a4dd680-710d-11e7-898a-176eb9e01b3a |
|         | ---------------------------------------------------|--------------------------------------------------|
|         |                   hi                               |                  bye                             |    
|-----------------------------------------------------------------------------------------------------------------|    
|  john   |  cassandra : 930ee570-710d-11e7-898a-176eb9e01b3a  |
|         |----------------------------------------------------|
|         |                whats up                            |
----------------------------------------------------------------

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

Таким образом, Кассандра выберет разделение и будет постоянно возвращать все значения этого раздела. затем следующий раздел. В вашем случае Либо "Том, Том, Джон" или "Джон, Том, Том"

MurmurHash3

Текущая версия - MurmurHash3, которая выдает 32-битное или 128-битное хеш-значение. При использовании 128-битных версий x86 и x64 не дают одинаковых значений, так как алгоритмы оптимизированы для соответствующих платформ.

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

В вашем случае данные для name будет заказан post_topic а также post_date,

Таким образом, возвращаемые данные могут быть tom,tom,john OR john,tom,tom... но это никогда не будет Том, Джон, Том...

Хэш Murmur3 не выдаст дублирующий токен для другого ключа раздела.

Замечания: Select * from table может привести к тайм-ауту, если таблица огромна... Не уверен насчет вашего варианта использования... но вы можете посмотреть на spark-cassandra-connector.

Другие вопросы по тегам