将伪数据插入Cassendra Counter表

时间:2017-01-27 19:40:54

标签: cassandra

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

我尝试了很多更新声明但是没有希望,如果有任何修复此示例的例子将受到高度赞赏

1 个答案:

答案 0 :(得分:1)

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 [无效查询] 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();

我在这里得到了同样的例外......我也尝试使用预定义的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();

我想我们应该把它归档为某种bug ......它看起来像你的 问题只是命名:)看起来像Queue是cql中的特殊内容

:)