gpt4 book ai didi

cassandra - 如何使用 IN 运算符更新 cassandra 中的数据

转载 作者:行者123 更新时间:2023-12-02 22:25:17 26 4
gpt4 key购买 nike

我有一个具有以下架构的表。

CREATE TABLE IF NOT EXISTS group_friends(
groupId timeuuid,
friendId bigint,
time bigint,
PRIMARY KEY(groupId,friendId));

如果群组中发生任何更改(例如更改群组名称或在表中添加新 friend 等),我需要跟踪时间。因此,每次相关表发生变化时,我都需要通过groupId更新time字段的值。

由于 cassandra 中的更新需要在 where 子句中提及所有主键,因此该查询将不会运行。

update group_friends set time = 123456 where groupId = 100;

所以我可以做这样的事情。

update group_friends set time=123456 where groupId=100 and friendId in (...);

但是显示以下错误-->

[Invalid query] message="Invalid operator IN for PRIMARY KEY part friendid"

有没有办法在聚类列中使用 IN 运算符执行更新操作?如果没有那么可能的方法是什么?

提前致谢。

最佳答案

由于friendId是一个集群列,在这种情况下,批处理操作可能是一个合理且性能良好的选择,因为所有更新都将在同一分区中进行(假设您使用相同的组ID进行更新)。例如,使用 java 驱动程序,您可以执行以下操作:

Cluster cluster = new Cluster.Builder().addContactPoint("127.0.0.1").build();
Session session = cluster.connect("friends");

PreparedStatement updateStmt = session.prepare("update group_friends set time = ? where groupId = ? and friendId = ?");

long time = 123456;
UUID groupId = UUIDs.startOf(0);
List<Long> friends = Lists.newArrayList(1L, 2L, 4L, 8L, 22L, 1002L);
BatchStatement batch = new BatchStatement(BatchStatement.Type.UNLOGGED);
for(Long friendId : friends) {
batch.add(updateStmt.bind(time, groupId, friendId));
}
session.execute(batch);
cluster.close();

这样做的另一个优点是,由于可以从 BatchStatement 推断分区键,因此驱动程序将使用 token 感知路由将请求发送到拥有此数据的副本,从而跳过网络跃点。

虽然这实际上是一次写入,但请注意批处理的大小。您应该注意不要让它太大。

在一般情况下,单独执行每个语句而不是使用批处理实际上不会出错。 CQL 传输允许在单个连接上发出多个请求,并且本质上是异步的,因此您可以同时处理多个请求,而不会产生每个连接一个请求的典型性能成本。

有关批量写入数据的更多信息,请参阅:Cassandra: Batch loading without the Batch keyword

或者,可能有一种更简单的方法来完成您想要的事情。如果您真正想要完成的是维护群组更新时间,并且您希望群组中的所有 friend 都保持相同的更新时间,则可以将时间设为 static column 。这是 Cassandra 2.0.6 中的新功能。其作用是共享 groupId 分区中所有行的列值。这样,您只需更新一次时间,您甚至可以在用于将 friend 添加到群组的查询中设置时间,以便将其作为一次写入操作完成。

CREATE TABLE IF NOT EXISTS friends.group_friends(
groupId timeuuid,
friendId bigint,
time bigint static,
PRIMARY KEY(groupId,friendId)
);

如果您还不能使用 Cassandra 2.0.6+,您可以创建一个名为 group_metadata 的单独表来维护组的时间,即:

CREATE TABLE IF NOT EXISTS friends.group_metadata(
groupId timeuuid,
time bigint,
PRIMARY KEY(groupId)
);

这里的缺点是,每当您想要获取这些数据时,您都需要从此表中进行选择,但这似乎是可以管理的。

关于cassandra - 如何使用 IN 运算符更新 cassandra 中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28847886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com