无法 运行 自定义聚合 OperationTimedOut:错误={},last_host=127.0.0.1

Failed to run custom aggregation OperationTimedOut: errors={}, last_host=127.0.0.1

我有一个 运行ning apache-cassandra-2.2.1,enable_user_defined_functionscassandra.yml 中设置为 true。我定义了一个基于 this article 的自定义聚合,如下所示:

CREATE FUNCTION sumFunc(current double, candidate double) CALLED ON NULL INPUT RETURNS double LANGUAGE java AS 'if(current == null) return candidate; return current + candidate;'
CREATE AGGREGATE sum(double) SFUNC sumFunc STYPE double INITCOND null;

当我从 CQLSH 控制台调用它时,我看到超时:

cqlsh:test> SELECT word, sum(frequency) FROM words;
OperationTimedOut: errors={}, last_host=127.0.0.1

我可以成功 运行 任何其他查询,我也可以 运行 来自 scala 的查询(但我没有得到完整的结果集):

CassandraConnector(conf).withSessionDo { session =>
  val result: ResultSet = session.execute("SELECT word, SUM(frequency) FROM test.words;")
  while(result.isExhausted == false) {
    println(result.one)
  }
}

首先,您的查询可能不会按照您的预期进行,因为它不会按 table 中的每个词进行分组。您将得到 table 中所有频率的总和。要获得一个词的频率总和,您需要这样做:

SELECT word, sum(frequency) FROM words WHERE word='someword';

其次,我在尝试聚合超过 300,000 行的大分区时看到超时错误(请参阅 this)。因此,您的 table 单词可能太大而无法在超时错误开始之前聚合。我希望 Cassandra 不会在正在取得进展的查询上超时,但它似乎有一些硬编码超时会中止任务,不管它们是在进行中还是实际上卡住了。

由于您的查询没有 WHERE 子句,您正试图聚合整个 table 而不仅仅是一个分区。这将更有可能导致超时错误,因为聚合将发生在分布在多个节点而不是单个节点上的数据上,因此您应该尝试将聚合限制为单个分区。

我认为对于 INITCOND,您希望使用 0 而不是 null。

聚合的名称可能与内置的系统求和函数冲突,因此您可能需要选择一个不同的名称。但副手看起来你可以使用内置的求和函数而不是定义一个(Cassandra 2.2 有 sum()、avg()、min() 和 max() 的未记录的内置函数)。