Разгруппировать / дезагрегировать по ВИЧ - PullRequest
0 голосов
/ 03 февраля 2019

Можно ли разгруппировать набор данных в улье?Я не верю, что вы можете боковое представление взорвать целое число.

Текущая таблица:

event  count
A      3
B      2

Таблица результатов:

event count
A     1
A     1
A     1
B     1
B     1

Столбец подсчета, очевидно, не супер важен врезультат.

Ответы [ 3 ]

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

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

Создайте udf, который будет возвращать последовательность чисел

[prjai@lnx0689 py_ws]$ cat prime_num.py
import sys

    try:
            for line in sys.stdin:
                    num = int(line)
                    for i in range(1, num+1):
                            #print u"i".encode('utf-8')
                            print u"%i".encode('utf-8') %(i)
    except:
            print sys.exc_info()

Добавить скрипт PythonENV

hive> add FILE /home/prjai/prvys/py_ws/prime_num.py

Создать временную таблицу для вышеуказанного сценария

hive> create temporary table t1 as with t1 as (select transform(10) using 'python prime_num.py' as num1) select * from t1;

Ваш запрос будет -

hive> with t11 as (select 'A' as event, 3 as count) select t11.event,  t11.count from t11, t1 where t11.count>=t1.num1;

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

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

Используя функцию space(), вы можете преобразовать count в строку пробелов с length = count-1, затем использовать split() для преобразования в массив и explode() с lateral view для генерации строк.Просто замените подзапрос a в моей демоверсии своей таблицей.

Демо:

select a.event, 
       1 as count --calculate count somehow if necessary
from
    (select stack(2,'A',3,'B',2) as (event, count)) a --Replace this subquery with your table name
    lateral view explode(split(space(a.count-1),' ')) s
;

Результат:

OK
A       1
A       1
A       1
B       1
B       1
Time taken: 0.814 seconds, Fetched: 5 row(s)
0 голосов
/ 03 февраля 2019

Один из вариантов - создать таблицу чисел и использовать ее для дезагрегации.

--create numbers table
create table if not exists dbname.numbers 
location 'some_hdfs_location' as 
select stack(5,1,2,3,4,5) t as num --increase the number of values as needed

--Disaggregation
select a.event,n.num --or a.cnt
from dbname.agg_table a 
join dbname.numbers n on true
where a.cnt >= n.num and a.cnt <= n.num
...