通过cqlsh请求对Cassandra执行减法的最佳方式是什么?

通过cqlsh请求对Cassandra执行减法的最佳方式是什么?,cassandra,cql3,database,nosql,Cassandra,Cql3,Database,Nosql,我正试图向卡桑德拉提出cqlsh请求。其思想是分析基因组中注释的不同“基因”寄存器的平均长度。输入数据后,我有一个athaliana.tab表: id | chr | comments | end | orf | sense | start | type --------------------------------------+-----+-------------------+-----

我正试图向卡桑德拉提出cqlsh请求。其思想是分析基因组中注释的不同“基因”寄存器的平均长度。输入数据后,我有一个athaliana.tab表:

 id                                   | chr | comments          | end      | orf | sense | start    | type
--------------------------------------+-----+-------------------+----------+-----+-------+----------+------
 d2ab2520-6734-11e5-955c-234085c1edec |   1 | gene_id AT1G16340 |  5590338 |   0 |     - |  5590241 |  CDS
 d4169c00-6734-11e5-955c-234085c1edec |   1 | gene_id AT1G16610 |  5676495 |   . |     - |  5676429 | exon
 a8c792c0-6734-11e5-955c-234085c1edec |   1 | gene_id AT1G07485 |  2301889 |   0 |     + |  2301665 |  CDS
 3bd5c0a0-6735-11e5-955c-234085c1edec |   1 | gene_id AT1G51980 | 19326916 |   . |     - | 19326733 | exon
 263b5b60-6735-11e5-955c-234085c1edec |   1 | gene_id AT1G44990 | 17007808 |   . |     - | 17007542 | gene
 67989a50-6735-11e5-955c-234085c1edec |   1 | gene_id AT1G63110 | 23405144 |   . |     + | 23404821 |  UTR
 26f7f4a0-6735-11e5-955c-234085c1edec |   1 | gene_id AT1G45180 | 17101207 |   0 |     + | 17101109 |  CDS
 3743dc70-6735-11e5-955c-234085c1edec |   1 | gene_id AT1G50840 | 18841644 |   0 |     + | 18840965 |  CDS
 e5099940-6734-11e5-955c-234085c1edec |   1 | gene_id AT1G20620 |  7145780 |   . |     + |  7145691 | exon
 2ba30620-6735-11e5-955c-234085c1edec |   1 | gene_id AT1G48180 | 17793717 |   . |     - | 17792449 | gene
其思想是获得结束-开始列数据之间的减法,然后计算平均值。我试过这样做:

SELECT avg(end-start) FROM athaliana.tab WHERE chr = '1' AND type = 'gene';
SELECT avg(minus(end,start)) FROM athaliana.tab WHERE chr = '1' AND type = 'gene';
但结果是:

SyntaxException: <ErrorMessage code=2000 [Syntax error in CQL query] message="line 1:14 no viable alternative at input '-' (SELECT avg([end]-...)">
语法异常:

一些想法?任何帮助都将不胜感激。

Cassandra设计用于最大的读写效率,不支持应用于多列的函数,如
加号
减号
,也不支持聚合,即应用于多行的函数,如
avg
计数

直到最近,解决方法还是将函数的结果存储在单独的列中,并在自己的应用程序代码中执行聚合

然而,Cassandra2.2和3.0现在提供了用户定义函数(UDF)和用户定义聚合(UDA)。您现在可以定义自己的函数,然后让Cassandra为您调用它们。请参阅和或上的CQL规范章节

首先,创建以下函数和聚合:

USE athaliana;

CREATE FUNCTION minus (x int, y int) RETURNS NULL ON NULL INPUT RETURNS int LANGUAGE java AS 'return x-y;';

CREATE FUNCTION avgState (state tuple<int,bigint>, val int) CALLED ON NULL INPUT RETURNS tuple<int,bigint>  LANGUAGE java AS '
    if (val != null) {
      state.setInt(0, state.getInt(0)+1);
      state.setLong(1, state.getLong(1)+val.intValue());
    }
    return state;
';

CREATE FUNCTION avgFinal (state tuple<int,bigint>) CALLED ON NULL INPUT RETURNS double LANGUAGE java AS '
    double r = 0;
    if (state.getInt(0) == 0) return null;
    r = state.getLong(1);
    r /= state.getInt(0);
    return Double.valueOf(r);
  ';

CREATE AGGREGATE avg(int) SFUNC avgState STYPE tuple<int,bigint> FINALFUNC avgFinal INITCOND (0, 0);

请注意,您应该只在单个分区键上使用聚合;如果情况并非如此,则会发出警告。

Cassandra设计用于最大的读写效率,不支持应用于多列的函数,如
加号
减号
,也不支持聚合,即应用于多行的函数,例如
avg
count

直到最近,解决方法还是将函数的结果存储在单独的列中,并在自己的应用程序代码中执行聚合

然而,Cassandra2.2和3.0现在提供了用户定义函数(UDF)和用户定义聚合(UDA)。您现在可以定义自己的函数,然后让Cassandra为您调用它们。请参阅和或上的CQL规范章节

首先,创建以下函数和聚合:

USE athaliana;

CREATE FUNCTION minus (x int, y int) RETURNS NULL ON NULL INPUT RETURNS int LANGUAGE java AS 'return x-y;';

CREATE FUNCTION avgState (state tuple<int,bigint>, val int) CALLED ON NULL INPUT RETURNS tuple<int,bigint>  LANGUAGE java AS '
    if (val != null) {
      state.setInt(0, state.getInt(0)+1);
      state.setLong(1, state.getLong(1)+val.intValue());
    }
    return state;
';

CREATE FUNCTION avgFinal (state tuple<int,bigint>) CALLED ON NULL INPUT RETURNS double LANGUAGE java AS '
    double r = 0;
    if (state.getInt(0) == 0) return null;
    r = state.getLong(1);
    r /= state.getInt(0);
    return Double.valueOf(r);
  ';

CREATE AGGREGATE avg(int) SFUNC avgState STYPE tuple<int,bigint> FINALFUNC avgFinal INITCOND (0, 0);
请注意,您应该只在单个分区键上使用聚合;如果情况并非如此,将发出警告