Я пытаюсь создать схему, которая позволит мне получить доступ к строкам только с частью row_key. Например, ключ имеет вид user_id: machine_os: machine_arch

Пример ключа строки: 12242: "windows2000": "x86"

Из документации я не мог понять, позволит ли это мне запрашивать все строки с идентификатором пользователя = 12242 или запрашивать все строки с "windows2000"

Есть ли какой-нибудь реальный способ добиться этого?

Благодарность,

Ядид

1
user2843110 3 Окт 2013 в 18:31
Не могли бы вы поделиться с нами структурой вашего семейства столбцов? Кроме того, какую часть ключа строки вы хотите использовать для поиска?
 – 
Nikhil
3 Окт 2013 в 18:46
Мое семейство столбцов состоит из имен столбцов, которые являются длинными, и значений, которые являются строками. Имена столбцов - это временные метки журнала, а значения - записи журнала. Я использую компилятор LongType для столбцов.
 – 
user2843110
3 Окт 2013 в 19:15
А какой у вас составной ключ? Если вы создали семейство col на CQL, можете ли вы предоставить описание вывода.
 – 
Nikhil
3 Окт 2013 в 19:16
Это и есть моя проблема - я использую не CQL, а скорее экономичный интерфейс для создания данных и доступа к ним. вот описание вывода моих данных: CREATE TABLE datacf (key bigint, key2 text, key3 text, column1 bigint, value blob, PRIMARY KEY ((key, key2, key3), column1)) С КОМПАКТНЫМ ХРАНЕНИЕМ И bloom_filter_fp_chance = 0.010000 И caching = 'KEYS_ONLY' AND comment = '' AND dclocal_read_repair_chance = 0.000000 AND gc_grace_seconds = 864000 AND read_repair_chance = 0.100000 AND replicate_on_write = 'true' И populate_io_cache_on_flush = 'false' И ......
 – 
user2843110
3 Окт 2013 в 19:22
Вам понадобится (как минимум) весь ключ раздела, чтобы найти часть данных. В противном случае вы даже не будете знать, какие узлы в кластере запрашивать ваши данные.
 – 
Aurand
3 Окт 2013 в 22:21

1 ответ

Лучший ответ

Хорошо, вот что происходит: на основе вашей схемы вы фактически создаете семейство столбцов с составным первичным ключом или составным ключом строки . Это означает, что вам нужно будет ограничить каждый компонент составного ключа, кроме последнего, с помощью отношения строгого равенства . Последний компонент составного ключа может использовать неравенство и отношение IN, но не 1-й и 2-й компоненты.

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

Фактически это означает, что вы не можете делать ничего из этого:

select * from datacf where user_id = 100012; # missing 2nd and 3rd key components
select * from datacf where user_id = 100012; and machine_arch = 'x86'; # missing 3rd key component
select * from datacf where machine_arch = 'x86'; # you have to specify the 1st
select * from datacf where user_id = 100012 and machine_arch in ('x86', 'x64'); # nope, still want 3rd

Однако вы сможете выполнять такие запросы:

select * from datacf where user_id = 100012 and machine_arch = 'x86'
   and machine_os = "windows2000"; # yes! all 3 parts are there

select * from datacf where user_id = 100012 and machine_os = "windows2000"
   and machine_arch in ('x86', 'x64'); # the last part of the key can use the 'IN' or other equality relations

Чтобы ответить на ваш первоначальный вопрос, с вашей существующей моделью данных вы не сможете запрашивать данные с помощью userid = 12242 или запрашивать все строки, которые имеют "windows2000" в качестве machine_os.

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

1
Nikhil 3 Окт 2013 в 22:35
Большое спасибо @Nikhil, теперь это намного яснее! Я надеялся выполнить такие запросы, как выбрать все записи для пользователя X или выбрать все записи с windows2000. Я опасаюсь, что при использовании вторичных индексов размер моих данных может стать проблемой (много-много мелких записей). Другой вариант - создать свои собственные индексы и поддерживать их вручную, верно?
 – 
user2843110
4 Окт 2013 в 00:10
Я не знаю размера ваших данных, но Cassandra была разработана для обработки огромных размеров данных, поэтому я бы попробовал сначала использовать вторичные индексы и измерить производительность, прежде чем изучать ручные индексы. Я дополню свой ответ более подробной информацией.
 – 
Nikhil
4 Окт 2013 в 07:55