我有一个表保存人,其中将包含数百万的数据。
表架构如下所示,在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值和键,如何建模数据,以便选择和更新必须具有快速的性能?< / p>
我正在尝试实现一些批量更新操作。
任何建议都值得赞赏。
答案 0 :(得分:1)
如果数据已经存在于地图中,那么您实际上并不需要将值也保留在自己的列中,并且如果它只是地图的键,那么在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个分片(对每个分片的异步调用并合并)。尽管如果您的键/值对的基数足够低,则可能不需要分片。然后,您将具有可以查找的ID列表。如果要避免查找,可以在该表中添加其他键和值,但是数据可能会大量膨胀,具体取决于您映射中的键数,并且保持所有更新都是很痛苦的。
我不推荐但可用的一个选项是为地图编制索引,即:
CREATE INDEX raw_data_idx ON susbcriber ( ENTRIES (raw_data) );
SELECT * FROM susbcriber WHERE raw_data['ios_identifier'] = 'id';
答案 1 :(得分:0)
是的,你可以。
Map用于在表中存储动态数据
您可以根据地图的 Keys
、Entries
或 values
获得索引
我在下面提到了三个选项。
如果您的用例是搜索动态数据的键,请先使用... 如果要搜索地图中 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>))