使用部分分区键从 Cassandra 中删除数据
Delete data from Cassandra with part of the partition key
假设我在 Cassandra 中有以下 table:
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_id
和order_id
,用于存储时间序列数据。
数据没有 TTL
,因为它应该可以随时访问。
在某些情况下,我们可能需要删除给定 store_id
的所有数据。
这样做的最佳做法是什么?
到目前为止我想到了以下解决方案:
- 编写一个程序,将 select 来自 table 的所有数据并删除具有给定
store_id
的记录。 - 缺点是随着我们在 table. 中插入更多数据,这将花费越来越多的时间
- 保留table中的数据。 - 这样做的唯一问题是我们将得到无用的数据。
- 将 table 名称与可用的分区键存储在不同的 table 中,可以由
store_id
查询,从中获取键并为每个创建一个删除语句或那些钥匙。 - 我不喜欢这个概念,因为我必须维护记录。
有人遇到过这个问题吗?从 Cassandra 中清除未使用记录的最佳做法是什么(不包括 TTL
)?
创建一个物化视图来存储属于相应 store_ids 的 product_ids。通过这种方式,您可以查询给定 store_id 的 MV,然后从主 table 中删除相应的行。这样可以避免额外的应用程序代码来维护两个不同的 tables.
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) ;
无法按部分分区键删除。
这是一种方法:
创建一个单独的 table,它将包含给定商店的所有 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
你可以在写的时候使用BATCH语句,这样你就可以获得原子性。
现在,在删除时,您可以获得给定 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
中删除相应的记录
假设我在 Cassandra 中有以下 table:
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_id
和order_id
,用于存储时间序列数据。
数据没有 TTL
,因为它应该可以随时访问。
在某些情况下,我们可能需要删除给定 store_id
的所有数据。
这样做的最佳做法是什么?
到目前为止我想到了以下解决方案:
- 编写一个程序,将 select 来自 table 的所有数据并删除具有给定
store_id
的记录。 - 缺点是随着我们在 table. 中插入更多数据,这将花费越来越多的时间
- 保留table中的数据。 - 这样做的唯一问题是我们将得到无用的数据。
- 将 table 名称与可用的分区键存储在不同的 table 中,可以由
store_id
查询,从中获取键并为每个创建一个删除语句或那些钥匙。 - 我不喜欢这个概念,因为我必须维护记录。
有人遇到过这个问题吗?从 Cassandra 中清除未使用记录的最佳做法是什么(不包括 TTL
)?
创建一个物化视图来存储属于相应 store_ids 的 product_ids。通过这种方式,您可以查询给定 store_id 的 MV,然后从主 table 中删除相应的行。这样可以避免额外的应用程序代码来维护两个不同的 tables.
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) ;
无法按部分分区键删除。
这是一种方法:
创建一个单独的 table,它将包含给定商店的所有 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
你可以在写的时候使用BATCH语句,这样你就可以获得原子性。
现在,在删除时,您可以获得给定 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