我在cassandra有一张桌子。 我的任务是: 我想选择具有时间范围的记录(因此时间戳必须是主键,而不是使用允许过滤) 当我在表中插入记录和provider_id和文件名时,记录会更新
CREATE TABLE test (
name text,
filename text,
timestamp timestamp,
is_deleted boolean,
PRIMARY KEY (provider_id, filename, timestamp)
)
答案 0 :(得分:3)
您无法更新主键列,它会插入另一条记录 这就是cassandra的工作原理 您必须使用provider_id选择时间戳,然后使用provider_id,filename和timestamp删除文件名,并使用新的时间戳重新插入
答案 1 :(得分:1)
如果要根据时间范围选择项目,则应使用群集列。您的create语句应为:
CREATE TABLE test (
provider_id UUID,
name text,
filename text,
timestamp timestamp,
is_deleted boolean,
PRIMARY KEY ((provider_id, filename), timestamp)
)
现在provider_id + filename是您的分区键,以及您的群集列的时间戳。
复合分区键由
provider_id
和filename
组成。该 群集列timestamp
,确定群集的顺序 数据。通常,Cassandra将存储具有相同的列provider_id
但在不同的节点和列上有不同的filename
在同一节点上具有相同的provider_id
和filename
。
这意味着您现在可以像这样查询您的数据:
SELECT * FROM test
WHERE provider_id = 1
AND filename = "test.txt"
AND timestamp >= '2016-01-01 00:00:00+0200' AND ts <= '2016-08-13 23:59:00+0200'
可能的更新:
UPDATE test
SET name = "test-new"
WHERE provider_id = 1
AND filename = "test.txt"
AND timestamp >= '2016-01-01 00:00:00+0200' AND ts <= '2016-08-13 23:59:00+0200'
更多info