Перебирайте строки Hive или SQL, присваивая значения в порядке убывания - PullRequest
1 голос
/ 19 сентября 2019

Для таблицы кустов или sql с 5 строками как разделить значение = 12 и назначить его строкам в порядке убывания.Например, как упомянуто в следующей таблице, где сумма столбца (всего) равна 12, а значения назначаются в порядке убывания.

column_1    column_2    total
   a           b          3
   c           d          3
   e           f          2
   g           h          2
   i           j          2

1 Ответ

0 голосов
/ 19 сентября 2019

Вы можете параметризовать этот запрос, используя переменные hivevar.Я проверил это с несколькими различными значениями общего числа = 12, 11, 16, кажется, работает правильно.Пожалуйста, оптимизируйте и отладьте его самостоятельно.Я просто представил идею:

with vars as(--calculate min_value, max_value and how many rows with max_value it should be (max_rows)
select
       ceil(total/num_rows)                 as max_value, 
       floor(total/num_rows)                as min_value,
       total-floor(total/num_rows)*num_rows as max_rows
from
(select 5 num_rows, 12 total)s --your variables, parametrize using hivevar variables
),

your_table as (--use your table instead of this
select stack(5,
   'a', 'b',
   'c', 'd',
   'e', 'f',
   'g', 'h',
   'i', 'j'
) as (column_1,column_2)
)-- this is your_table, suppose column_1 determines the order of rows

select column_1,column_2, case when rn<=max_rows then max_value else min_value end as total
       --, rn, min_value, max_value, max_rows --debug values
from
(
select t.*, row_number() over(order by column_1) rn,  
       v.min_value, 
       v.max_value, 
       v.max_rows
 from your_table t
      cross join vars v
)s;

Результат:

column_1    column_2    total   
a   b   3   
c   d   3   
e   f   2   
g   h   2   
i   j   2   

Для итогового = 11 он возвращает:

column_1    column_2    total   
a   b   3   
c   d   2   
e   f   2   
g   h   2   
i   j   2   

Для итогового = 16 он возвращает:

column_1    column_2    total   
a   b   4   
c   d   3   
e   f   3   
g   h   3   
i   j   3   

Конечно, там все еще может быть какая-то ошибка, которую необходимо тщательно проверить, прежде чем использовать в качестве компонента управления ядерным реактором.Не проверено с различным количеством строк в исходной таблице.Но это определенно работает для начальных условий в вашем вопросе.

Также можно оптимизировать, рассчитав количество строк как count(*) over() as num_rows в запросе из вашей таблицы и параметризовав только один параметр: total (это 12в твоем примере).Логика вычисления max_value, min_value и max_rows может быть перемещена в один и тот же запрос из your_table, без перекрестного соединения, вы можете сделать то же самое без подзапроса vars.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...