【问题标题】:is there a way to index map type column in cassandra有没有办法在 cassandra 中索引地图类型列
【发布时间】:2019-07-16 13:50:45
【问题描述】:

我有一个表订阅者,其中将包含数百万条数据

表模式在 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&lt;text, text&gt;,' 上进行过滤查询,此列包含 JSON 值和键,我如何对数据进行建模以便 选择和更新必须在性能上快速

我正在尝试实现一些批量更新操作。

非常感谢任何建议。

【问题讨论】:

    标签: cassandra data-modeling cassandra-3.0 cqlsh


    【解决方案1】:

    如果数据已经在地图中,您实际上也不需要将值保留在自己的列中,并且如果它只是地图的键,则在 cassandra 上更容易将其表示为集群键而不是像这样的集合:

    CREATE TABLE susbcriber_data (
        id int,
        key text,
        value text,
        PRIMARY KEY((id), 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 或某个值,以使您的分区不会变大(需要根据预期负载进行一些猜测)。然后要查看 key = value 的所有值,您需要查询所有 12 个这些分片(对每个分片进行异步调用并合并)。尽管如果您的键/值对的基数足够低,则可能不需要分片。然后,您将获得一个可以查找的 id 列表。如果您想避免查找,您可以向该表添加一个额外的键和值,但您的数据可能会爆炸相当多,具体取决于您在地图中拥有的键的数量,并且保持所有内容更新将是痛苦的。

    我不推荐但可用的一个选项是索引地图,即:

    CREATE INDEX raw_data_idx ON susbcriber ( ENTRIES (raw_data) );
    
    SELECT * FROM susbcriber WHERE raw_data['ios_identifier'] = 'id';
    

    记住issues with secondary indexes

    【讨论】:

    • 你能让它更容易理解吗,因为我无法准确地得到我能推断出的东西,如上面的例子 raw_data 可以有更多的键(比表结构键)和表结构是固定的。
    • 一个更直接的手动索引可能也有主键,而不是简单的((key, value), id),这对于读取来说会稍微更有效率,但压缩会慢得多(你可能不关心)。如果您想尽可能快地读取((key, value), id, key)value text,那么您可以获取在给定键/值的单次读取中完全实现的订阅列表。更新订阅中的值会很痛苦,但写入速度很快,如果您对磁盘空间使用情况满意,可以一次性完成。
    【解决方案2】:

    是的,你可以。 Map用于在表中存储动态数据 您可以拥有基于地图的KeysEntriesvalues 的索引

    我在下面提到了三个选项。

    如果您的用例是搜索动态数据的键,那么首先使用... 如果您想在地图中搜索 known 键的值,请使用第二个... 如果您不知道键只想搜索地图中的值,请使用第三个。

    Create index idx_first on <keyspaceName.tableName> (Keys (<mapColumn>))
    Create index idx_second on <keyspaceName.tableName> (Entries (<mapColumn>))
    Create index idx_third on <keyspaceName.tableName> (Values (<mapColumn>))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2015-12-27
      • 1970-01-01
      • 2017-12-22
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多