Hive: Как вывести общее количество строк в качестве переменной - PullRequest
1 голос
/ 09 марта 2020

У меня есть набор данных, который я дублирую со следующим кодом:

select session_id, sol_id, id, session_context_code, date
    from (
        select *, ROW_NUMBER() OVER (PARTITION BY session_id, sol_id, date) as rn,
        substr(case_id,2,9) as id

        from df.t1_data
         )undup
        where undup.rn =1 
        order by session_id, sol_id, date

Я хочу добавить переменную, которая хранит общее количество строк после дедупликации, и я попытался с помощью count ( *):

select session_id, sol_id, id, session_context_code, date,count(*) as total
    from (
        select *, ROW_NUMBER() OVER (PARTITION BY session_id, sol_id,date) as rn,
        substr(case_id,2,9) as id

        from df.t1_data
         )undup
        where undup.rn =1 
        order by session_id, sol_id, date

Полученная ошибка:

ОШИБКА: Ошибка выполнения: org. apache .hive.service.cli.HiveSQLException: Ошибка при компиляции оператора: СБОЙ: SemanticException [Ошибка 10025]: Строка 1:44 Выражение отсутствует в ключе GROUP BY 'session_id'

Я просто хочу вывести счетчик как переменную, которая подсчитывает все отдельные записи по session_id и sol_id после обманываются по номеру строки. Как включить это в код?

По предложению Гомза, но получена ошибка:

ОШИБКА: Ошибка выполнения: org. apache .hive.service.cli. HiveSQLException: ошибка при компиляции оператора: FAILED: ParseException строка 1: 614 отсутствует EOF в 'group' рядом с 'nifi_date'

Код:

select session_id, solicit_id, nifi_date,id, session_context_code,count(*) as total
    from (
        select *, ROW_NUMBER() OVER (PARTITION BY session_id, sol_id) as rn,
        substr(case_id,2,9) as id
        from df.t1_data
         )undup
        where undup.rn =1 and 
        session_context_code in ("4","3") and
        order by session_id, sol_id, nifi_date
        group by session_id, sol_id, nifi_date,id, session_context_code

1 Ответ

1 голос
/ 09 марта 2020

В запросе Hive с COUNT(*) вместе со столбцами в предложении SELECT эти столбцы должны быть сгруппированы в конце с GROUP BY.

Некоторые примеры:

SELECT COUNT(*) FROM employees;

SELECT id, name, COUNT(*) FROM employees GROUP BY id, name;

В вашем сценарии проблемы запрос должен выглядеть следующим образом:

select session_id, sol_id, id, session_context_code, count(*) as total
    from (
        select *, ROW_NUMBER() OVER (PARTITION BY session_id, sol_id,date) as rn,
        substr(case_id,2,9) as id

        from df.t1_data
         )undup
        where undup.rn =1 
GROUP BY session_id, sol_id, id, session_context_code
        order by session_id, sol_id, date

Вы можете прочитать подробнее ЗДЕСЬ

Обновление: Если вы хотите подсчитать все отдельные записи только по session_id и sol_id, тогда запрос может быть следующим:

select session_id, sol_id, count(*) as total
    from (
        select *, ROW_NUMBER() OVER (PARTITION BY session_id, sol_id,date) as rn,
        substr(case_id,2,9) as id

        from df.t1_data
         )undup
        where undup.rn =1 
GROUP BY session_id, sol_id
        order by session_id, sol_id, date;

Как уже говорилось, вы можете использовать только те столбцы, которые вы нужно подсчитывать в SELECT и GROUP BY.

Если вам нужно, чтобы результаты с несколькими столбцами превышали то, что нужно подсчитать, вы можете создать временную таблицу только с теми столбцами, которые подсчитаны, и объединить с исходным Таблица. то есть, если вам нужны столбцы c, d, e, f из таблицы, даже если вам нужно количество столбцов a, b, тогда вы можете сделать что-то, как показано ниже:

CREATE TABLE tmp AS 
SELECT a, b, count(*)
FROM table1
GROUP BY a,b;

Do СОЕДИНЕНИЕ между tmp и table1 в столбцах a, b

SELECT y.a, y.b, x.c, x.d, x.e, x.f
FROM tmp y, table1 x
WHERE y.a=x.a
AND y.b=x.b;

Надеюсь, это поможет!

...