2014-05-28 2 views
1

У меня возникли проблемы с получением процента.Расчет процента на улей

colA | cloB | colC 
4 | a | y 
5 | b | y 
7 | a | n 
8 | a | y 
------------------ 
Output: 
a 67% 
b 100% 

Мне нужно получить процентное значение colC (все «y») для каждой буквы в colB.

Мне удалось получить оба итога отдельно, но, похоже, не может получить процент от работы.
Получает общее значение «y» для a, b (colB);

SELECT colB, COUNT(*) FROM tbl WHERE colC = '"y"' GROUP BY colB; 
Output: 
a 2 
b 1 

Получает составляет общий итог для colB

SELECT COUNT(colC) FROM tbl WHERE colC = '"y"'; 
Output: 
4 

Заранее спасибо

ответ

3

Используйте IF UDF, чтобы избежать присоединиться

SELECT t1.colB, 
    SUM(IF(colC == 'y', 1 , 0))/ COUNT(*) * 100 as pct 
FROM tbl t1 
GROUP BY t1.colB; 
+0

Это работает, спасибо :) – user3657361

0

Вы можете написать пользовательские функции (UDF) См: Программирование улей

0

Я не (еще: D) эксперт в Hive, но вы можете попробовать такой подзапрос:

SELECT 
    t1.colB, 
    100*(count(colB)/sub.cnt) 
FROM 
    tbl t1, 
    (SELECT COUNT(colC) as cnt 
    FROM tbl 
    WHERE colC = 'y') sub 
JOIN 
    tbl ON (sub.colC = tbl.colC)) 
GROUP BY 
    colB; 

Пс: Я не уверен на 100%, и я не могу проверить его на самом деле, просто пытаясь помочь.

+0

Спасибо, я попробовал код. Это дает мне ошибку «FAILED ParseException line 1:47 missing EOF at ',' near 'tbl1' – user3657361

+0

Да, мое плохое, на самом деле вы не можете просто поместить таблицу и подзапрос в предложение FROM так же, i Мне действительно нужно найти решение. Я переиздал, скажи мне. Если он все еще не запускается, я покажу вам пример с объединением, который, я уверен, работает, но не оптимизирован :( – Junayy

+0

Это говорит Не удалось распознать предикат 't1 '. Неверное правило:' kwInner 'в спецификаторе типа соединения. – user3657361