Cassandra CQL中的聚合查询

时间:2014-05-08 03:17:20

标签: cassandra cql

我们目前正在评估Cassandra作为分析应用程序的数据存储。计划是在Cassandra中转储原始数据,然后主要运行聚合查询。看看CQL,它似乎不支持一些传统的SQL运算符,如:

  • 典型的聚合函数,如average,sum,count-Distinct等。
  • 拥有运营商的Groupby

我没有找到任何有助于在文档中实现上述内容的内容。还检查是否有任何钩子提供扩展等功能。比如在Mongodb中的数据库map-reduce或关系数据库中的用户定义函数。

人们确实谈到付费的Datastax企业版,这也不是通过普通的Cassandra实现的,而是通过Hadoop-Hive-Pig-Hadoop等单独的组件实现。或者有关于在转储数据之前进行必要的预聚合的建议因为Cassandra写的很快就到了DB。

看起来太多的开销,至少对于我们需要的基本内容。我错过了一些基本的东西吗?

非常感谢您的帮助。

7 个答案:

答案 0 :(得分:2)

在一个特定的应用程序中,我们使用Cassandra来提高写入速度,然后让应用程序将数据压缩为更加压缩,略微聚合的摘要形式。然后我们运行每小时的工作将摘要表单复制到Postgres表。这种方法在优雅方面并不高分,但它很简单,这意味着我们可以运行临时分析查询,而不必使主数据入口路径复杂化或必须在CQL应用程序中构建定制聚合

答案 1 :(得分:2)

作为CASSANDRA-4914的一部分,cassandra中提供了聚合,可在2.2.0-rc1版本中找到。

答案 2 :(得分:1)

这只是我们在案例中所做的建议。要在cassandra数据库上进行聚合,您需要使用像PIG或HIVE这样的语言,这些语言在内部生成map-reduce代码,这对代码中的大数据非常有用。为此,您需要设置Hadoop环境。处理完成后,可以将处理过的数据写入cassandra datbase或sqoop到mysql数据库。

答案 3 :(得分:1)

根据数据的性质,如果您需要对时间序列等数据执行聚合,您应该考虑使用Kdb +。

我还在评估Cassandra存储时间序列遥测数据。我认为这是一个完美的契合。但是,我发现没有聚合功能。也许这可以与Pig和Hive一起解决。但是,如果存在将数据摄取,存储和分析结合为一种语言的解决方案,为什么您不会考虑它呢?

答案 4 :(得分:1)

我将Cassandra视为一种存储引擎,它解决了分发和可用性问题,同时保持了规模和性能。当然,权衡是灵活性和功能性。它总是在数据库世界中的功能和性能之间进行权衡。

话虽如此,Cassandra与Spark等第三方软件非常相配。 Spark可能对您的用例非常有帮助。有一个开源连接器https://github.com/datastax/spark-cassandra-connector,可帮助Spark智能地查找和运行Cassandra数据分析。

SparkSQL允许您运行SELECT总和以及大多数符合hive的查询。

答案 5 :(得分:1)

您可以使用Apache Lucene插件(https://github.com/Stratio/cassandra-lucene-index)在Cassandra中创建CUSTOM INDEXES,或者您可以使用符合您目的的其他软件(搜索引擎数据存储),例如Elasticsearch(https://www.elastic.co/products/elasticsearch)&#39 ; s也是可扩展和开源的。

Elasticsearch也可以与Kibana一起用于基于汇总数据的数据可视化。

答案 6 :(得分:1)

检查出来

  

原生聚合

     

计数

     

count函数可用于计算查询返回的行数。   例如:

SELECT COUNT (*) FROM plays;
SELECT COUNT (1) FROM plays;
     

它还可用于计算给定列的非空值:

SELECT COUNT (scores) FROM plays;
     

最大和最小

     

max和min函数可用于计算最大值和最小值   给定列的查询返回的最小值。例如:

SELECT MIN (players), MAX (players) FROM plays WHERE game = 'quake';
     

萨姆

     

sum函数可用于汇总a返回的所有值   查询给定列。例如:

SELECT SUM (players) FROM plays;
     

平均

     

avg函数可用于计算所有值的平均值   由给定列的查询返回。例如:

SELECT AVG (players) FROM plays;

您还可以在此处创建自己的聚合,有关聚合的更多文档:http://cassandra.apache.org/doc/latest/cql/functions.html?highlight=aggregate