无法通过Datastax-PHP库增加Cassandra计数器

时间:2015-07-22 10:22:53

标签: java php apache cassandra datastax

我有以下计数器列系列:

CREATE TABLE subscription_counter (
    subscription_id timeuuid,
    amount counter,
    PRIMARY KEY(subscription_id)
);

在cqlsh中并运行以下查询时,它按预期工作,数量增加1.

UPDATE subscription_counter SET amount = amount + 1 WHERE subscription_id = 840e5f80-2fc7-11e5-9597-a1ae67be6e20

但是,从Datastax-PHP库(http://datastax.github.io/php-driver/),以下查询会抛出异常。

$statement = $session->prepare("UPDATE subscription_counter SET amount = amount + ? WHERE subscription_id = ?");
$result = $session->execute($statement, new Cassandra\ExecutionOptions(array(
    'arguments' => array(1, $subscription_id)
)));

例外:

PHP Fatal error:  Uncaught exception 'Cassandra\Exception\InvalidQueryException' with message 'Expected 8 or 0 byte long (4)' in /var/www/vhosts/cassandra_test/v4import.php:193
Stack trace:
#0 /var/www/vhosts/cassandra_test/v4import.php(193): Cassandra\DefaultSession->execute(Object(Cassandra\PreparedStatement), Object(Cassandra\ExecutionOptions))
#1 /var/www/vhosts/cassandra_test/v4import.php(116): processUser(Object(Cassandra\DefaultSession), 'stuart.armstron...', 'stu', 'armstrong', Array)
#2 {main}
  thrown in /var/www/vhosts/cassandra_test/v4import.php on line 193

php -v

PHP 5.6.11 (cli) (built: Jul 12 2015 20:21:03)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies

java -version

OpenJDK Runtime Environment (rhel-2.4.4.1.el6_5-x86_64 u51-b02)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)

我已经尝试将1投射为浮动但是这不能按预期工作并产生大量的数字,这些都没有意义。我试过谷歌,但只能找到关于如何解压缩8字节int的this stackoverflow问题,但我不知道如何从中创建一个。

之前有没有人使用过这个库的计数器?这可能是一个php配置问题吗?

据我所知,我正在使用该库,因为所有其他查询似乎都正常工作。

如果我能提供更多有用的信息,请告诉我。

2 个答案:

答案 0 :(得分:2)

我发现Cassandra提供了一个Bigint对象,当使用它时,它可以工作。

$int = new Cassandra\Bigint('1');
$statement = $session->prepare("UPDATE subscription_counter SET amount = amount + ? WHERE subscription_id = ?");
$result = $session->execute($statement, new Cassandra\ExecutionOptions(array(
        'arguments' => array($int, $subscription_id)
)));

答案 1 :(得分:0)

对于java客户端,您将使用long基本类型映射到CQL计数器类型。例如,这是一个更新计数器的访问者查询(Datastax java客户端):

@Accessor
public interface MyCountersAccessor {

    @Query("UPDATE my_counters SET count = count + :increment WHERE key = :key")
    ResultSet incrementCount(@Param("key") String key, @Param("increment") long increment);
}