将虚拟数据插入 Cassandra Counter 表

AMH*_*AMH 2 cassandra

我知道我不能在计数器表中插入,但是如果表为空如何使用更新,更新语句需要k_where

我尝试了很多更新语句,但不希望任何解决此问题的示例将受到高度赞赏

Mar*_*jek 5

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
Run Code Online (Sandbox Code Playgroud)

请考虑到,除了主键列之外,您在表中可能只有使用计数器定义的计数器列。而且您总是更新数据,分区键只是简单地更新插入。

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

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

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

我从你原来的问题开始:

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

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

create table QueueMetric(
    QueueName text primary key,
    Time timeuuid,
    TotalCompletedMessages counter
)
Run Code Online (Sandbox Code Playgroud)

InvalidRequest: code=2200 [无效查询] message="不能在同一个表中混合计数器和非计数器列"

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

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();
Run Code Online (Sandbox Code Playgroud)

我在这里遇到同样的异常...我也尝试使用预定义的 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';
Run Code Online (Sandbox Code Playgroud)

这个我也失败了...

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

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';
Run Code Online (Sandbox Code Playgroud)

这也不起作用......让我们尝试仅使用分区键:

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();
Run Code Online (Sandbox Code Playgroud)

现在真的变得很奇怪......我会尝试使用不同的名称;

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();
Run Code Online (Sandbox Code Playgroud)

好吧,可能是时候了:

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';
Run Code Online (Sandbox Code Playgroud)

看起来好像必须有主键和列?

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';
Run Code Online (Sandbox Code Playgroud)

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

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';
Run Code Online (Sandbox Code Playgroud)

这也行不通:)

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';
Run Code Online (Sandbox Code Playgroud)

现在这完全可以工作了:)在我看来,你有一些奇怪的名字,实际上让我们尝试一下你一开始的同样的事情,但名字不同:

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();
Run Code Online (Sandbox Code Playgroud)

我想我们应该将其作为某种错误归档...在我看来,您的问题只是命名:) 看起来队列在 cql 中是特殊的东西

:)