2015-09-25 3 views
0

у меня есть следующие таблицы t1:Расчет медианные значения в энцефалопатией

key value 
1 38.76 
1 41.19 
1 42.22 
2 29.35182 
2 28.32192 
3 33.66 
3 33.47 
3 33.35 
3 33.47 
3 33.11 
3 32.98 
3 32.5 

Я хочу, чтобы вычислить медиану для каждой группы ключей. Согласно documentation, функция percentile_approx должна работать для этого. Средние значения для каждой группы:

1 41.19 
2 28.83 
3 33.35 

Однако функция percentile_approx возвращает эта:

1 39.974999999999994 
2 28.32192 
3 33.23.0000000000004 

которые явно не являются средними значениями.

Это был запрос я побежал:

select key, percentile_approx(value, 0.5, 10000) as median 
from t1 
group by key 

Это, кажется, не принимая во внимание одно значение для каждой группы, что приводит к неправильной медианы. Заказ не влияет на результат. Есть идеи?

ответ

1

В улье медиан не может быть рассчитан напрямую, используя доступные встроенные функции. Ниже запрос используется для поиска медианы.

set hive.exec.parallel=true; 
    select temp1.key,temp2.value 
    from 
     (
     select key,cast(sum(rank)/count(key) as int) as final_rank 
     from 
     (
     select key,value, 
     row_number() over (partition by key order by value) as rank 
     from t1 
    ) temp 
     group by key)temp1 
    inner join 
    (select key,value,row_number() over (partition by key order by value) as rank 
     from t1 )temp2 
     on 
     temp1.key=temp2.key and 
     temp1.final_rank=temp3.rank; 

Выше запроса находит row_number для каждой клавиши, заказывая значения для ключа. Наконец, это займет средний row_number каждого ключа, который дает медианное значение. Также я добавил еще один параметр «hive.exec.parallel = true;», который позволяет параллельно выполнять независимые задания.

+0

Как это относится к сценарию, когда существует четное число значений? Также почему вы группируете ключ в первой части, когда вы не используете какие-либо агрегированные функции. @Nithiyanandhan. – Danzo

+0

. Я отредактировал свой ответ. Первая часть будет заказывать значения на основе ключа и находить номер средней строки, вторая часть найдет номер строки для каждой клавиши. Присоединившись к первому результату и второму результату, мы получим медиану для ключа. Это также будет сценарий с четным числом. – anand

Смежные вопросы