我使用的是cassandra 3.10,为了在非主分区上使用Group by Function,我指的是:http://www.batey.info/cassandra-aggregates-min-max-avg-group.html,它使用映射键进行相同的操作。当我执行select group_and_total(name,count) from school;
并收到错误ServerError: java.lang.NullPointerException: Map keys cannot be null
时。
问题在于name列中包含一些空值,可以通过修改函数并获得所需结果而不是删除其中包含空值的行来实现。
表的模式为
Table school{
name text,
count int,
roll_no text,
...
primary key(roll_no)
}
我用于分组依据的功能是:
CREATE FUNCTION state_group_and_total( state map<text, int>, type text, amount int )
CALLED ON NULL INPUT
RETURNS map<text, int>
LANGUAGE java AS '
Integer count = (Integer) state.get(type); if (count == null) count = amount; else count = count + amount; state.put(type, count); return state; ' ;
CREATE OR REPLACE AGGREGATE group_and_total(text, int)
SFUNC state_group_and_total
STYPE map<text, int>
INITCOND {};
答案 0 :(得分:0)
您提到的架构
CREATE TABLE temp.school (
roll_no text PRIMARY KEY,
count int,
name text
)
将样本输入到表中
roll_no | count | name
---------+-------+------
6 | 1 | b
7 | 1 | null
4 | 1 | b
3 | 1 | a
5 | 1 | b
2 | 1 | a
1 | 1 | a
(7 rows)
注意:“名称”列中只有一个空值。
修改的函数定义
CREATE FUNCTION temp.state_group_and_total(state map<text, int>, type text, amount int)
RETURNS NULL ON NULL INPUT
RETURNS map<text, int>
LANGUAGE java
AS $$Integer count = (Integer) state.get(type);if (count == null) count = amount;else count = count + amount;state.put(type, count); return state;$$;
注意:已删除CALLED ON NULL INPUT
并添加了RETURNS NULL ON NULL INPUT
总体定义:
CREATE AGGREGATE temp.group_and_total(text, int)
SFUNC state_group_and_total
STYPE map<text, int>
INITCOND {};
查询输出:
cassandra@cqlsh:temp> select group_and_total(name,count) from school;
temp.group_and_total(name, count)
-----------------------------------
{'a': 3, 'b': 3}
(1 rows)