L oop через таблицу параметров и возвращаемое объединение результатов запроса - PullRequest
1 голос
/ 29 марта 2020

У меня есть таблица Hive, и мне нужно выполнить запрос, аналогичный приведенному ниже, для различных значений параметров date, identifier1, identifier2, lower и upper и объединить результаты вместе .

Select 
col1,
col2,
new_time,
sum(col3),
case 
when "date" between date1 and date2 then 'No'
when "date" between date3 and date4 then 'Yes'
end as date_group,
case when "date" < e then 'test1' else 'test2' end as test_group,
'identifier1' as ID,
'identifier2' as ID2
FROM Table1
WHERE (new_time between time1 and time2)
      AND (tag between 'lower' and 'upper')
GROUP BY 
col1,
col2,
new_time,
case 
when "date" between date1 and date2 then 'No'
when "date" between date3 and date4 then 'Yes'
end,
case when "date" < e then 'test' else 'test2' end 

Моя первоначальная идея состояла в том, чтобы создать приведенную ниже таблицу параметров и l oop через каждую строку, которая содержит комбинацию значений параметров и объединяет результаты.

+------------+-------------+-------------+--------+-------+
|    date    | identifier1 | identifier2 | lower  | upper |
+------------+-------------+-------------+--------+-------+
| 2019-05-12 |           1 | A           |     10 |    20 |
| 2019-07-10 |           2 | B           |     30 |    40 |
| 2019-04-10 |           3 | C           |     60 |    70 |
| 2019-04-11 |           4 | D           |    423 |   500 |
| 2019-07-10 |           5 | E           |     85 |    88 |
+------------+-------------+-------------+--------+-------+

Две проблемы Я не уверен, как go об этом, и я не уверен, разрешает ли hiveql циклы. Я бы предпочел решение для улья, но решение SQL может сработать, если я смогу переместить свою промежуточную таблицу в реляционную базу данных. Решение будет эквивалентно приведенному ниже запросу объединения, в котором выделены значения параметров.

enter image description here

Любая помощь с решением приветствуется, спасибо.

1 Ответ

0 голосов
/ 29 марта 2020

Создайте таблицу параметров и используйте соединения. Я не уверен на 100%, какие параметры и какие столбцы, но что-то вроде этого:

SELECT t1.col1, t1.col2, t1.new_time, sum(t1.col3),
       (case when "date" between a and b then 1
             when "date" between c and d then 2
        end) as date_group,
       (case when "date" < e then 'test1' else 'test2' end) as test_group,
      p.identifier as ID,
      p.identifier2 as ID2
FROM Table1 t1 CROSS JOIN
      params p
WHERE t1.new_time BETWEEN t1.time1 AND t1.time2 AND
      t1.tag BETWEEN p.lower AND p.upper
GROUP BY t1.col1, t1.col2, t1.new_time, 
      (case when p."date" between a and b then 1
            when p."date" between c and d then 2
       end),
      (case when p."date" < e then 'test' else 'test2' end),
      p.identifier, p.identifier2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...