Обработка нулевых значений в ключах карты - PullRequest
0 голосов
/ 26 февраля 2019

Я использую cassandra 3.10, и для использования функции Group by на неосновных разделах я имею в виду: 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)
}

Функции, которые я использую для Group by:

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 {};

1 Ответ

0 голосов
/ 27 февраля 2019

Упомянутая вами схема

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...