max(),cassandra中的distinct和groupby

50few1ms  于 2021-06-09  发布在  Cassandra
关注(0)|答案(4)|浏览(464)

我正在尝试重新构建一个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。。?请告知其他可能的方法。。

wf82jlnq

wf82jlnq1#

Cassandra不支持这样的行动。你可以使用像Hive在上面的东西,或者有一个(非免费的)产品从acunu可能做你需要的。
另一个解决办法是自己动手。例如,可以通过读入特定行的所有数据并求和来求和。或者保持一个cassandra计数器在运行中递增。

e5nqia27

e5nqia272#

虽然这是一个老问题,但它在谷歌搜索结果中出现的频率相当高。所以我想更新一下。
Cassandra2.2+支持用户定义函数和用户定义聚合。警告:这并不意味着您不必再进行数据建模(正如@theo所指出的那样),它只允许您在检索时稍微预处理数据。
从demo2中选择distinct(a2),其中b2='sea'
实施 DISTINCT ,您应该定义一个函数和一个agregate。我将调用函数和聚合 uniq 而不是 distinct 强调它是用户定义的。

CREATE OR REPLACE FUNCTION uniq(state set<text>, val text)
  CALLED ON NULL INPUT RETURNS set<text> LANGUAGE java
  AS 'state.add(val); return state;';
CREATE OR REPLACE AGGREGATE uniq(text)
  SFUNC uniq STYPE set<text> INITCOND {};

然后按如下方式使用:

SELECT uniq(a2) FROM demo2 where b2='sea';

从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:

CREATE OR REPLACE FUNCTION state_group_and_max(state map<text, int>, type text, amount int)
  CALLED ON NULL INPUT
  RETURNS map<text, int>
  LANGUAGE java AS '
    Integer val = (Integer) state.get(type);
    if (val == null) val = amount; else val = Math.max(val, amount);
    state.put(type, val);
    return state;
  ' ;

CREATE OR REPLACE AGGREGATE state_group_and_max(text, int) 
  SFUNC state_group_and_max
  STYPE map<text, int> 
  INITCOND {};

然后按如下方式使用:

SELECT state_group_and_max(a1, b1) FROM demo1;

注意事项

正如上面提到的,您仍然需要在数据建模上投入一些时间,不要过度使用这些特性
你必须把 enable_user_defined_functions=true 在你的 cassandra.yaml 启用功能
可以重载函数以支持按不同类型的列进行分组。

参考文献:

伟大的自定义项和自定义项的例子,由克里斯托弗贝蒂和其他几个
关于自定义项和自定义项的税务文件
cassandra 3.0中的用户定义函数(planet cassandra博客)

brtdzjyr

brtdzjyr3#

使用cassandra,您可以通过在插入数据时做更多的工作来解决这类问题--这听起来会很慢,但cassandra是为快速写入而设计的,您可能会读取数据的次数比写入数据的次数多得多,因此当您考虑整个系统时,这是有意义的。
我不能确切地告诉您如何创建表来模拟问题,因为这在很大程度上取决于细节。您需要制定一个模式,使您能够在不执行任何动态聚合的情况下获取数据。考虑如何在rdbms中为查询创建视图,然后尝试考虑如何将数据直接插入到这些视图中,而不是插入到基础表中。这就是你在《Cassandra》中的建模方式。

nfzehxib

nfzehxib4#

Cassandra3.10现在支持分组密钥和集群密钥。有关详细信息,请参阅此链接。

相关问题