Я пытаюсь создать схему, которая позволит мне получить доступ к строкам только с частью row_key. Например, ключ имеет вид user_id: machine_os: machine_arch
Пример ключа строки: 12242: "windows2000": "x86"
Из документации я не мог понять, позволит ли это мне запрашивать все строки с идентификатором пользователя = 12242 или запрашивать все строки с "windows2000"
Есть ли какой-нибудь реальный способ добиться этого?
Благодарность,
Ядид
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
в качестве первичного ключа и используйте вторичные индексы для других столбцов, по которым вы хотите запросить.
Похожие вопросы
Новые вопросы
cassandra
Apache Cassandra — это хорошо масштабируемое, в конечном итоге согласованное, распределенное, структурированное хранилище строк/столбцов. Вопросы об администрировании сервера Cassandra можно задать на странице https://dba.stackexchange.com/questions/tagged/cassandra.