我正在尝试重新构建一个sql数据库cassandra,以便为sql查询找到cassandra等价物。我使用cql3和cassandrav1.2。我在cassandra中对db设计建模,以便它支持orderby子句和非规范化的表来支持join操作。然而,当涉及到distinct、sum()和groupby等值时,我却不知所措
SELECT a1,MAX(b1) FROM demo1 group by a1.
SELECT DISTINCT (a2) FROM demo2 where b2='sea'
SELECT sum(a3), sum(b3) from demo3 where c3='water' and d3='ocean'
这对我过去几天的工作来说就像是一场闹剧。在cassandra中,有没有一种方法可以对db模式进行建模,以支持这类查询?我想不出Cassandra有什么办法。如何使用cassandra实现这些查询?
我读到在cassandra上的一个Hive层可以使这些查询工作。我只是想知道,这是否是唯一的方式,这样的查询可以支持在Cassandra。。?请告知其他可能的方法。。
4条答案
按热度按时间wf82jlnq1#
Cassandra不支持这样的行动。你可以使用像Hive在上面的东西,或者有一个(非免费的)产品从acunu可能做你需要的。
另一个解决办法是自己动手。例如,可以通过读入特定行的所有数据并求和来求和。或者保持一个cassandra计数器在运行中递增。
e5nqia272#
虽然这是一个老问题,但它在谷歌搜索结果中出现的频率相当高。所以我想更新一下。
Cassandra2.2+支持用户定义函数和用户定义聚合。警告:这并不意味着您不必再进行数据建模(正如@theo所指出的那样),它只允许您在检索时稍微预处理数据。
从demo2中选择distinct(a2),其中b2='sea'
实施
DISTINCT
,您应该定义一个函数和一个agregate。我将调用函数和聚合uniq
而不是distinct
强调它是用户定义的。然后按如下方式使用:
从demo3中选择sum(a3),sum(b3),其中c3='water'和d3='ocean'
SUM
是提供了开箱即用,工作如你所料。看到了吗system.sum
.从demo1 group by a1中选择a1,max(b1)
GROUP BY
是个棘手的问题。实际上,无法按某个列对结果行进行分组。但你能做的就是创造一个map<text, int>
在Map上手动分组。根据christopher batey博客中的一个例子,group by和max:然后按如下方式使用:
注意事项
正如上面提到的,您仍然需要在数据建模上投入一些时间,不要过度使用这些特性
你必须把
enable_user_defined_functions=true
在你的cassandra.yaml
启用功能可以重载函数以支持按不同类型的列进行分组。
参考文献:
伟大的自定义项和自定义项的例子,由克里斯托弗贝蒂和其他几个
关于自定义项和自定义项的税务文件
cassandra 3.0中的用户定义函数(planet cassandra博客)
brtdzjyr3#
使用cassandra,您可以通过在插入数据时做更多的工作来解决这类问题--这听起来会很慢,但cassandra是为快速写入而设计的,您可能会读取数据的次数比写入数据的次数多得多,因此当您考虑整个系统时,这是有意义的。
我不能确切地告诉您如何创建表来模拟问题,因为这在很大程度上取决于细节。您需要制定一个模式,使您能够在不执行任何动态聚合的情况下获取数据。考虑如何在rdbms中为查询创建视图,然后尝试考虑如何将数据直接插入到这些视图中,而不是插入到基础表中。这就是你在《Cassandra》中的建模方式。
nfzehxib4#
Cassandra3.10现在支持分组密钥和集群密钥。有关详细信息,请参阅此链接。