Улей вычислить среднее и среднее по группам - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть набор данных с подсчетами по штатам и округам, и я хотел бы рассчитать медиану и среднее по штатам и округам, например:

Имеет:

ID  state    county  count
1   MD       aa          2
2   MD       aa          4
3    VA        bb         1
4    VA        bb         2
5    VA        bb         4
6    VA        cc          7
7    VA        cc          8

Хотите:

enter image description here

То, что у меня есть, дает ошибку:

Select id,  STATE,COUNTY,count,
percentile(cast(count as BIGINT), 0.5) OVER() as overall_median, 
round(avg(count),2) OVER() as overall_avg,

percentile(cast(count as bigint),0.5) OVER(PARTITION BY id,STATE) as med_state,
percentile(cast(count as bigint),0.5) as med_county,

AVG(count) OVER (PARTITION BY id, STATE) as avg_state,
AVG(count) AS avg_county,
from have
group by id, state, county

Ошибка получена, когда не используется группа:

ОШИБКА: Ошибка выполнения: org. apache .hive.service.cli.HiveSQLException: Ошибка при компиляции оператора: FAILED: SemanticException Не удалось разбить вызовы Windowing на группы. Как минимум 1 группа должна зависеть только от входных столбцов. Также проверьте наличие циклических зависимостей. Основная ошибка: org. apache .had oop .hive.ql.parse.SemanticException: строка 1: 457 Выражение отсутствует в ключе GROUP BY 'id'

Код без группы:

Select id,  STATE,county,count,
percentile(cast(count as BIGINT), 0.5) OVER() as overall_median, 
round(avg(count),2) OVER() as overall_avg,

percentile(cast(count as bigint),0.5) OVER(PARTITION BY id,STATE) as med_state,
percentile(cast(count as bigint),0.5) OVER(PARTITION BY id,STATE,county) as med_county,


AVG(count) OVER (PARTITION BY id, STATE) as avg_state,
AVG(count) OVER (PARTITION BY id, STATE, county) as avg_county,
from have

Спасибо!

1 Ответ

1 голос
/ 26 февраля 2020

исправлено: round (avg (count) OVER (), 2)

    select 
        id, STATE, county, count,
        percentile(cast(count as BIGINT), 0.5) OVER() as overall_median, 
        round(avg(count) OVER(), 2) as overall_avg,

        percentile(cast(count as bigint), 0.5) OVER(PARTITION BY id, STATE) as med_state,
        percentile(cast(count as bigint), 0.5) OVER(PARTITION BY id, STATE, county) as med_county,

        AVG(count) OVER (PARTITION BY id, STATE) as avg_state,
        AVG(count) OVER (PARTITION BY id, STATE, county) as avg_county
    from 
        have

Совет: не используйте ключевое слово (то есть count) в качестве имени столбца - у вас будет много проблем в будущем

...