cassandra中的数据模型及适当的删除策略

sdnqo3pr  于 2021-06-13  发布在  Cassandra
关注(0)|答案(2)|浏览(397)

我在Cassandra有下表:

CREATE TABLE article ( 
id text, 
price int, 
validFrom timestamp,     
PRIMARY KEY (id, validFrom)
) WITH CLUSTERING ORDER BY (validFrom DESC);

商品和历史价格信息(validfrom是新价格的时间戳)。商品价格经常变动。我想查询
特定物品的历史价格。
商品的最后价格。
根据我的理解,我可以通过以下查询解决这两个问题: select id, price from article where id = X validFrom < Y limit 1; 此查询使用项目id作为限制,查询使用分区键。由于聚类顺序是基于validfrom时间戳的倒序,cassandra可以高效地执行此查询。我说得对吗?
删除旧数据的最佳方法是什么(内部管理)。假设,我想删除所有 validFrom > 20150101 and validFrom < 20151231 . 因为我没有主键,所以即使我在validfrom上使用索引,这也是低效的,对吧?我怎样才能做到这一点?

nhhxz33t

nhhxz33t1#

为了补充亚历克斯·奥特的回答,你的评论是不正确的:
此查询使用项目id作为限制,查询使用分区键。由于聚类顺序是基于价格的,cassandra可以高效地执行这个查询。
行不是按顺序排列的 price . 他们是按 validFrom 按相反的时间顺序。干杯!

r7knjye2

r7knjye22#

您可以使用外部工具:
使用spark cassandra接头(即使在本地模式下)点火。代码可以如下所示(注意,我正在使用 validfrom 作为名字,不是 validFrom ,因为它没有在您的架构中转义):

import com.datastax.spark.connector._
val data = sc.cassandraTable("test", "article")
   .where("validfrom >= '2020-07-28T11:50:00Z' AND validfrom < '2020-07-28T12:50:00Z'")
   .select("id", "validfrom")
data.deleteFromCassandra("test", "article", keyColumns=SomeColumns("id", "validfrom"))

使用dsbulk查找匹配的条目并将它们输出到文件中( output.csv 在我的情况下),然后执行删除:

bin/dsbulk unload -url output.csv \
  -query "SELECT id, validfrom FROM test.article WHERE token(id) > :start AND token(id) <= :end AND validFrom >= '2020-07-28T11:50:00Z' AND validFrom < '2020-07-28T12:50:00Z' ALLOW FILTERING"
bin/dsbulk load -query "DELETE from test.article WHERE id = :id and validfrom = :validfrom" \
  -url output.csv

相关问题