Если данные уже есть на карте, вам на самом деле не нужно хранить значения также в их собственных столбцах, и если это просто ключ к карте, на cassandra проще представить его как ключ кластеризации, а не как коллекцию, например:
CREATE TABLE susbcriber_data (
id int,
key text,
value text,
PRIMARY KEY((id), key))
Тогда вы можете запросить любой идентификатор и ключ.Если вы ищете, где конкретный ключ имеет значение, отличное от
CREATE TABLE susbcriber_data_by_value (
id int,
shard int,
key text,
value text,
PRIMARY KEY((key, shard), value, id))
Затем, когда вы вставляете, вы устанавливаете shard равным id % 12
или некоторому значению, так что ваши разделы не становятся большими (нужно немного угадатьна основе ожидаемой нагрузки).Затем, чтобы увидеть все значения, где ключ = значение, вам нужно запросить все 12 из этих шардов (асинхронный вызов каждого и объединение).Хотя, если ваша кардинальность для пар ключ / значение достаточно мала, шард может оказаться ненужным.Тогда у вас будет список идентификаторов, которые вы можете посмотреть.Если вы хотите избежать поиска, вы можете добавить дополнительный ключ и значение в эту таблицу, но ваши данные могут взорваться немного в зависимости от количества ключей, которые у вас есть на карте, и держать все в курсе будет болезненно.
Вариант, который я бы не рекомендовал, но который доступен, заключается в индексировании карты, т. Е.
CREATE INDEX raw_data_idx ON susbcriber ( ENTRIES (raw_data) );
SELECT * FROM susbcriber WHERE raw_data['ios_identifier'] = 'id';
Принимая во внимание проблемы со вторичными индексами .