Есть ли способ индексировать столбец типа карты в Кассандре - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть таблица susbcriber, , которая будет содержать миллионы данных .

Схема таблицы, как показано ниже в Кассандре -

CREATE TABLE susbcriber (
    id int PRIMARY KEY,
    age_identifier text,
    alternate_mobile_identifier text,
    android_identifier text,
    batch_id text,
    circle text,
    city_identifier text,
    country text,
    country_identifier text,
    created_at text,
    deleted_at text,
    email_identifier text,
    gender_identifier text,
    ios_identifier text,
    list_master_id int,
    list_subscriber_id text,
    mobile_identifier text,
    operator text,
    partition_id text,
    raw_data map<text, text>,
    region_identifier text,
    unique_identifier text,
    updated_at text,
    web_push_identifier text
) WITH bloom_filter_fp_chance = 0.01
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 0
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';

Я должен сделать запрос фильтра в основном на 'raw_data map<text, text>,' этот столбец содержит значения и ключи JSON. Как я могу смоделировать данные так, чтобы выбор и обновление были быстрыми по производительности ?

Я пытаюсь выполнить некоторые операции массового обновления.

Любые предложения приветствуются.

1 Ответ

0 голосов
/ 22 февраля 2019

Если данные уже есть на карте, вам на самом деле не нужно хранить значения также в их собственных столбцах, и если это просто ключ к карте, на 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';

Принимая во внимание проблемы со вторичными индексами .

...