如何在Cassandra 2.2中获取前5条记录

斯玛哈瓦尔

我需要帮助。我有一个查询,该查询按日期(而不是日期+时间)和金额总和获得前5个记录组。

我写了以下内容,但它返回所有记录,而不仅仅是前5条记录

CREATE OR REPLACE FUNCTION state_groupbyandsum( state map<text, double>, datetime text, amount text )
CALLED ON NULL INPUT
RETURNS map<text, double>
LANGUAGE java 
AS 'String date = datetime.substring(0,10); Double count = (Double) state.get(date);  if (count == null) count = Double.parseDouble(amount); else count = count +  Double.parseDouble(amount); state.put(date, count); return state;' ;


CREATE OR REPLACE AGGREGATE groupbyandsum(text, text) 
SFUNC state_groupbyandsum
STYPE map<text, double>
INITCOND {};

select groupbyandsum(datetime, amout) from warehouse;

您能帮忙得到5条记录吗?

吉姆·迈耶(Jim Meyer)

这是做到这一点的一种方法。您的按状态分组功能可能是这样的:

CREATE FUNCTION state_group_and_total( state map<text, double>, type text, amount double )
CALLED ON NULL INPUT
RETURNS map<text, double>
LANGUAGE java AS '
     Double count = (Double) state.get(type);
     if (count == null)
         count = amount;
     else
         count = count + amount;
     state.put(type, count);
     return state;
';

这将建立一个由您的查询WHERE子句选择的所有数量行的映射。现在最棘手的部分是如何仅保留前N个。一种实现方法是使用FINALFUNC,它在将所有行都放入映射后执行。因此,这里有一个函数可以使用循环在映射中找到最大值并将其移动到结果映射中。因此,要找到前N个,它会在地图上迭代N次(比这更有效的算法,但这只是一个快速而肮脏的示例)。

因此,这里有一个查找前两个示例的示例:

CREATE FUNCTION topFinal (state map<text, double>)
CALLED ON NULL INPUT
RETURNS map<text, double>
LANGUAGE java AS '
    java.util.Map<String, Double> inMap = new java.util.HashMap<String, Double>(),
                                  outMap = new java.util.HashMap<String, Double>();

    inMap.putAll(state);

    int topN = 2;
    for (int i = 1; i <= topN; i++) {
        double maxVal = -1;
        String moveKey = null;
        for (java.util.Map.Entry<String, Double> entry : inMap.entrySet()) {

            if (entry.getValue() > maxVal) {
                maxVal = entry.getValue();
                moveKey = entry.getKey();
            }
        }
        if (moveKey != null) {
            outMap.put(moveKey, maxVal);
            inMap.remove(moveKey);
        }
    }

    return outMap;
';

最后,您需要定义AGGREGATE来调用您定义的两个函数:

CREATE OR REPLACE AGGREGATE group_and_total(text, double) 
     SFUNC state_group_and_total 
     STYPE map<text, double> 
     FINALFUNC topFinal
     INITCOND {};

因此,让我们看看是否可行。

CREATE table test (partition int, clustering text, amount double, PRIMARY KEY (partition, clustering));
INSERT INTO test (partition , clustering, amount) VALUES ( 1, '2015', 99.1);
INSERT INTO test (partition , clustering, amount) VALUES ( 1, '2016', 18.12);
INSERT INTO test (partition , clustering, amount) VALUES ( 1, '2017', 44.889);
SELECT * from test;

 partition | clustering | amount
-----------+------------+--------
         1 |       2015 |   99.1
         1 |       2016 |  18.12
         1 |       2017 | 44.889

现在,鼓声...

SELECT group_and_total(clustering, amount) from test where partition=1;

 agg.group_and_total(clustering, amount)
-------------------------------------------
            {'2015': 99.1, '2017': 44.889}

因此,您会看到它根据数量保留了前2行。

请注意,键是地图,因此不会按排序顺序排列,而且我认为我们无法控制地图中的键顺序,因此在FINALFUNC中进行排序将浪费资源。如果您需要对地图进行排序,则可以在客户端中进行。

我认为您可以在state_group_and_total函数中进行更多工作,以便在进行操作时从地图中删除项目。最好不要使地图变得太大。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Cassandra 2.2中获取前5条记录

来自分类Dev

如何确定Javascript数组对象中的前2条记录

来自分类Dev

如何从Angular 2中的firebase获取一条记录

来自分类Dev

如何在XSLT中每行显示2条记录

来自分类Dev

如何在EC2上配置Cassandra

来自分类Dev

如何在SQL Server中查找2条记录之间的时差

来自分类Dev

如何使用linq跳过最后2条记录并获取所有其他记录?

来自分类Dev

从配置单元中的表中获取最新的 2 条记录

来自分类Dev

如何在Cassandra中使用QueryBuilder定义具有2个条件的Where查询?

来自分类Dev

如何在Laravel 5中调用2条前缀路由通用的特定控制器

来自分类Dev

根据特定列排序后如何获取除前5条记录以外的所有记录

来自分类Dev

如何在 Embedded-Cassandra 中获取特定版本的 Cassandra

来自分类Dev

如何在Cassandra中获取表的大小?

来自分类Dev

每组只选择前 2 条记录

来自分类Dev

如何在单个db2查询中精确更新一条记录并选择更新的行

来自分类Dev

如何在SQL Server 2008 R2中的select语句中访问上一条记录?

来自分类Dev

如何在单个db2查询中精确更新一条记录并选择更新的行

来自分类Dev

如何从Redis获取前100条记录

来自分类Dev

如何在SQL中每2分钟获取一次记录

来自分类Dev

如何在Spark DataFrame中基于B列获取A列的5条记录

来自分类Dev

如何使用通配符比较同一表中的2条记录?

来自分类Dev

在MongoDB中,当记录超过100条时,如何对2d索引的$ near查询进行排序?

来自分类Dev

如何在JavaScript中获取小数点后的前2个非零数字

来自分类Dev

如何在Python中获取字符串的前2个字母?

来自分类Dev

如何在 OBIEE 11g 分析中获取前 2 年的数据

来自分类Dev

如何在python中从2D数组的不同行获取的点之间绘制一条线?

来自分类Dev

如何在 Jupyter (IPython, rpy2) 中获取交互式 R 输出,例如用于进度条?

来自分类Dev

如何重启Cassandra EC2实例?

来自分类Dev

如何在cassandra中构造范围查询?

Related 相关文章

  1. 1

    如何在Cassandra 2.2中获取前5条记录

  2. 2

    如何确定Javascript数组对象中的前2条记录

  3. 3

    如何从Angular 2中的firebase获取一条记录

  4. 4

    如何在XSLT中每行显示2条记录

  5. 5

    如何在EC2上配置Cassandra

  6. 6

    如何在SQL Server中查找2条记录之间的时差

  7. 7

    如何使用linq跳过最后2条记录并获取所有其他记录?

  8. 8

    从配置单元中的表中获取最新的 2 条记录

  9. 9

    如何在Cassandra中使用QueryBuilder定义具有2个条件的Where查询?

  10. 10

    如何在Laravel 5中调用2条前缀路由通用的特定控制器

  11. 11

    根据特定列排序后如何获取除前5条记录以外的所有记录

  12. 12

    如何在 Embedded-Cassandra 中获取特定版本的 Cassandra

  13. 13

    如何在Cassandra中获取表的大小?

  14. 14

    每组只选择前 2 条记录

  15. 15

    如何在单个db2查询中精确更新一条记录并选择更新的行

  16. 16

    如何在SQL Server 2008 R2中的select语句中访问上一条记录?

  17. 17

    如何在单个db2查询中精确更新一条记录并选择更新的行

  18. 18

    如何从Redis获取前100条记录

  19. 19

    如何在SQL中每2分钟获取一次记录

  20. 20

    如何在Spark DataFrame中基于B列获取A列的5条记录

  21. 21

    如何使用通配符比较同一表中的2条记录?

  22. 22

    在MongoDB中,当记录超过100条时,如何对2d索引的$ near查询进行排序?

  23. 23

    如何在JavaScript中获取小数点后的前2个非零数字

  24. 24

    如何在Python中获取字符串的前2个字母?

  25. 25

    如何在 OBIEE 11g 分析中获取前 2 年的数据

  26. 26

    如何在python中从2D数组的不同行获取的点之间绘制一条线?

  27. 27

    如何在 Jupyter (IPython, rpy2) 中获取交互式 R 输出,例如用于进度条?

  28. 28

    如何重启Cassandra EC2实例?

  29. 29

    如何在cassandra中构造范围查询?

热门标签

归档