有没有一种方法可以索引cassandra中的map类型列

57hvy0tb  于 2021-06-10  发布在  Cassandra
关注(0)|答案(1)|浏览(455)

我有一个susbcriber表,它将包含数百万个数据。
在cassandra中,表模式如下所示-

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值和键,如何对数据进行建模,以使select和update的性能更快?
我正在尝试实现一些批量更新操作。
任何建议都将不胜感激。

pepwfjgg

pepwfjgg1#

如果数据已经存在于Map中,那么实际上不需要将值也保留在它们自己的列中,如果它只是Map的一个键,那么cassandra更容易将其表示为一个集群键,而不是一个集合,如:

CREATE TABLE susbcriber_data (
    id int,
    key text,
    value text,
    PRIMARY KEY((id), key))

然后您可以通过任何id和键进行查询。如果您正在查找某个特定键的值大于

CREATE TABLE susbcriber_data_by_value (
    id int,
    shard int,
    key text,
    value text,
    PRIMARY KEY((key, shard), value, id))

然后,当你插入你设置碎片 id % 12 或者一些值,这样分区就不会太大(需要根据预期负载进行一些猜测)。然后要查看key=value的所有值,需要查询所有12个shard(异步调用每个shard并合并)。尽管如果键/值对的基数足够低,shard可能是不必要的。然后您将有一个可以查找的ID列表。如果要避免查找,可以向该表中添加额外的键和值,但数据可能会爆炸,这取决于Map中的键数,保持所有内容的更新将非常痛苦。
我不推荐但可用的一个选项是索引Map,即:

CREATE INDEX raw_data_idx ON susbcriber ( ENTRIES (raw_data) );

SELECT * FROM susbcriber WHERE raw_data['ios_identifier'] = 'id';

记住二级索引的问题。

相关问题