使用部分分区键从Cassandra中删除数据

8

假设我在Cassandra中有如下表格:

customer_bought_product (
    store_id uuid,
    product_id text,
    order_time timestamp,
    email text,
    first_name text,
    last_name text,
    PRIMARY KEY ((store_id, product_id), order_time, email)

分区键是store_idorder_id,用于存储时间序列数据。
数据没有TTL,因为它应该随时可访问。
在某些情况下,我们可能需要删除给定store_id的所有数据。最佳实践是什么?
到目前为止,我想到了以下解决方案:
  1. 编写一个程序,从表中选择所有数据并删除具有给定store_id的记录。-缺点是随着我们在表中插入更多数据,这将需要越来越多的时间。
  2. 保留表中的数据。-唯一的问题是我们将拥有无用的数据。
  3. 将可用分区键的表名存储在不同的表中,该表可以通过store_id进行查询,获取这些键并为每个键创建一个删除语句。-我不喜欢这个概念,因为我必须维护记录。
有人遇到过这个问题吗?从Cassandra中清除未使用的记录的最佳做法是什么(不包括TTL)?

你如何使用部分分区键访问数据?在生产环境中,ALLOW FILTERING 的代价和效率都很高。 - dilsingi
当我访问数据时,我有特定的“product_id”和“store_id”。 - Ivan Stoyanov
所以只有在删除期间,您才拥有仅存储store_id和通过product_id和store_id的分区键进行正常访问模式。我基于此提供了我的答案。 - dilsingi
2个回答

5
创建一个物化视图来存储属于相应店铺ID的产品ID。这样,您可以查询MV以获取给定的store_id,然后从主表中删除相应的行。这样就可以避免编写额外的应用程序代码来维护两个不同的表。
create materialized view mv_customer_bought_product 
as select product_id, store_id, order_time, email 
from customer_bought_product 
where order_time is not null 
and email is not null 
and product_id is not null 
and store_id is not null 
primary key (store_id, product_id, order_time, email) ;

在物化视图中,除了store_id和product_id列之外的其他列可以被排除,这将有助于节省磁盘空间。 - Arun Joy Thekkiniyath
2
@ArunJoyThekkiniyath,您需要在主表的主键中将所有列也出现在物化视图中。没有例外可以节省存储空间 :) - dilsingi
谢谢你的回答。使用物化视图是一个好的解决方案,因为我只需要维护一个表。 - Ivan Stoyanov
我所看到的唯一问题是数据分布不正确,导致热点问题,因为有些商店可能有数百种产品,而其他商店可能有数千种。 - Ivan Stoyanov

1

无法通过分区键的一部分进行删除。

以下是一种方法:

创建一个单独的表,该表将具有给定商店的所有 product_id。

CREATE TABLE product_by_store(
store_id uuid,
product_id set<text>,
PRIMARY KEY(store_id)
);

现在在写入customer_bought_product时,还要更新到product_by_store,类似于以下内容: UPDATE product_by_store SET product_id=product_id + 'someValue' WHERE store_id=GIVEN_STORE_ID 在写入时可以使用批处理语句,这样就可以获得原子性。
现在,在删除时,您可以获取给定store_id的所有product_id,然后使用以下语句: DELETE FROM customer_bought_product WHERE store_id=GIVEN_STORE_ID and product_id in (PRODUCT_ID YOU GET from product_by_store table) 同时也要从customer_bought_product中删除相应的记录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接