gpt4 book ai didi

cassandra - 将虚拟数据插入 Cassandra 计数器表

转载 作者:行者123 更新时间:2023-12-02 20:52:16 25 4
gpt4 key购买 nike

我知道我不能insert in counter table,但是如果表是空的怎么用update,update语句需要k_where

我尝试了很多更新语句,但没有希望,如果有任何示例可以解决这个问题,我们将不胜感激

最佳答案

create table test_counter(a text primary key, v counter);

update test_counter set v = v + 1 where a = 'dummy';

select * from test_counter;

dummy | v
-------------------+---
some_counter_name | 1

请注意,除了主键列外,您在表中可能只有用计数器定义的计数器列。此外,您总是更新数据,只是更新分区键。

如果你想把计数器归零,你必须读取它的当前值,然后你必须设置为 v = v - read_value。请注意,可能还有其他并发更新。

即使客户端收到更新失败的消息,计数器有时也会更新,因此它们不是 100% 可靠。

收到评论后 :) 看来您遇到了某种 Cassandra 命名错误。这是我对您的问题的探索:

我从你原来的问题开始:

Update "QueueMetric"
Set "TotalCompletedMessages" = TotalCompletedMesseages + 1
where "QueueName" = 'Test Queue one'
and "Time" = now();

所以我创建了一个简单的表格:

create table QueueMetric(
QueueName text primary key,
Time timeuuid,
TotalCompletedMessages counter
)

InvalidRequest: code=2200 [Invalid query] message="Cannot mix counter and non counter columns in the same table"

然后我想你的创建语句是这样的:

create table QueueMetric(
QueueName text,
Time timeuuid,
TotalCompletedMessages counter,
primary key (QueueName, Time)
)

Update QueueMetric Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one' and Time = now();

我在这里遇到同样的异常......我也尝试使用预定义的 uuid 而不是现在

你的例子也没有意义,因为你为什么要按 timeuuid 聚集计数器?

事情是一次性的,即使每秒 10000 个请求,您也必须生成它们 100 年才能发生碰撞。我认为您真正需要的是时间戳。

然后我尝试将时间列定义为字符串:

create table QueueMetric(
QueueName text,
Time text,
TotalCompletedMessages counter,
primary key (QueueName, Time)
)

Update QueueMetric Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one' and Time = 'd14d44b2-e4d1-11e6-bf01-fe55135034f3';

这个我也失败了...

所以现在我的想法是时间在某种程度上是个错误的名字

create table QueueMetric(
QueueName text,
Test text,
TotalCompletedMessages counter,
primary key (QueueName, Test)
);

Update QueueMetric Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one' and Test = 'd14d44b2-e4d1-11e6-bf01-fe55135034f3';

这也行不通......让我们尝试只使用分区键:

create table QueueMetric(
QueueName text,
Time timeuuid,
TotalCompletedMessages counter,
primary key ((QueueName, Time))
);

Update QueueMetric Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one' and Time = now();

现在真的越来越奇怪了……我换个名字试试;

create table QueueMetric2(
QueueName text,
Time timeuuid,
TotalCompletedMessages counter,
primary key ((QueueName, Time))
);

Update QueueMetric2 Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one' and Time = now();

好的,可能是时候了:

create table QueueMetric3(
QueueName text,
SomethingOther text,
TotalCompletedMessages counter,
primary key ((QueueName, SomethingOther))
);

Update QueueMetric3 Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one' and SomethingOther = 'd14d44b2-e4d1-11e6-bf01-fe55135034f3';

只是看起来必须有主键和列?

create table QueueMetric4(
QueueNamePlusTimeUUID text,
TotalCompletedMessages counter,
primary key (QueueNamePlusTimeUUID)
);

Update QueueMetric4 Set TotalCompletedMessages = TotalCompletedMesseages + 1 where QueueName='Test Queue one d14d44b2-e4d1-11e6-bf01-fe55135034f3';

现在我真的很困惑,把所有东西都小写吗?

create table queuemetric5(
queuenameplustimeUUID text primary key,
totalcompletedmessages counter
);

update queuemetric5 set totalcompletedmessages = totalcompletedmessages + 1 where queuename='Test Queue one d14d44b2-e4d1-11e6-bf01-fe55135034f3';

这也行不通:)

create table abc(
a text primary key,
t counter
);

update abc set t = t + 1 where a='Test Queue one d14d44b2-e4d1-11e6-bf01-fe55135034f3';

这现在完全有效了:)在我看来你实际上有一些奇怪的名字让我们尝试与开始时相同但名称不同的东西:

create table hohoho(
n text,
o timeuuid,
m counter,
primary key (n, o)
);

update hohoho set m = m + 1 where n='Test Queue one' and o = now();

我想我们应该将其作为某种错误归档……在我看来它是您的问题只是命名 :) 看起来 Queue 在 cql 中很特别

:)

关于cassandra - 将虚拟数据插入 Cassandra 计数器表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41901797/

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