无法通过 Datastax-PHP 库增加 Cassandra 计数器
Can't increment Cassandra counter through Datastax-PHP library
我有以下计数器列系列:
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-版本
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 转换为浮点数,但它没有按预期工作,并且产生了没有意义的巨大数字。我试过 google,但只能找到 this 关于如何解压 8 字节 int 的 Whosebug 问题,但我看不到如何从中创建一个。
有人用过这个库的计数器吗?这可能是 php 配置问题吗?
据我所知,我正在正确使用该库,因为所有其他查询似乎都运行良好。
如果我能提供更多有用的信息,请告诉我。
我发现 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)
)));
对于 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);
}
我有以下计数器列系列:
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-版本
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 转换为浮点数,但它没有按预期工作,并且产生了没有意义的巨大数字。我试过 google,但只能找到 this 关于如何解压 8 字节 int 的 Whosebug 问题,但我看不到如何从中创建一个。
有人用过这个库的计数器吗?这可能是 php 配置问题吗?
据我所知,我正在正确使用该库,因为所有其他查询似乎都运行良好。
如果我能提供更多有用的信息,请告诉我。
我发现 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)
)));
对于 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);
}