Как преобразовать этот SQL MYSQL в SQL HIVE? - PullRequest
0 голосов
/ 28 апреля 2018

В столбцы таблицы ProductOrder входят:

id   shopid starttime endtime 
1    123    2018-04-27  2018-04-28
2    234    2018-04-23  2018-04-30
3    189    2018-05-01  2018-05-30
4    321    2018-05-01  2018-05-29

Я не хочу запрашивать действительные значения количества покупок между двумя днями и количество дней в году за последний месяц, действительные значения числа магазинов означают время начала <= $ curDate <= время окончания, а curDate - переменная каждого дня последний месяц. </p>

Сегодня 2018-04-27 ,, поэтому результат запроса должен быть:

day          count
2018-04-27    2
2018-04-26    1
2018-04-25    1
2018-04-24    1
2018-04-23    1
2018-04-22    0
2018-04-21    0
……………………………………
2018-03-26    0

Я выполняю это требование в MYSQL. Этот SQL может хорошо работать в MYSQL. Как я могу преобразовать в Hive Sql?

SELECT
    DATE_SUB(DATE(NOW()), INTERVAL days_ago.days DAY) day,
    COUNT(distinct(shopID)) count
FROM
(SELECT 0 days UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION
 SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION
 SELECT 10 UNION SELECT 11 UNION SELECT 12 UNION SELECT 13 UNION SELECT 14 UNION
 SELECT 15 UNION SELECT 16 UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION
 SELECT 20 UNION SELECT 21 UNION SELECT 22 UNION SELECT 23 UNION SELECT 24 UNION
 SELECT 25 UNION SELECT 26 UNION SELECT 27 UNION SELECT 28 UNION SELECT 29)
    AS days_ago
LEFT JOIN ProductOrder
    ON DATE_SUB(DATE(NOW()), INTERVAL days_ago.days DAY) <= ProductOrder.endtime
    AND DATE_SUB(DATE(NOW()), INTERVAL days_ago.days DAY) >= ProductOrder.starttime
    AND status = 2
GROUP BY days_ago.days;

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Hive не поддерживает неэквивалентные условия, вместо этого они могут быть помещены в предложение WHERE. Используйте STACK вместо многих подзапросов UNION.

select DATE_SUB(CURRENT_DATE, days_ago.days) day, 
       COUNT(DISTINCT(shopID)) count 
from
(
select stack(30, --the number of elements
           0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
          10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
          20, 21, 22, 23, 24, 25, 26, 27, 28, 29) as (days) 
 ) days_ago
LEFT JOIN ProductOrder po ON status = 2
WHERE (DATE_SUB(CURRENT_DATE, days_ago.days) <= po.endtime  
  AND DATE_SUB(CURRENT_DATE, days_ago.days) >= po.starttime)
   OR po.shopID is NULL --allow nulls  
GROUP BY DATE_SUB(CURRENT_DATE, days_ago.days);
0 голосов
/ 29 апреля 2018
SELECT DATE_SUB(CURRENT_DATE, days_ago.days), 
       COUNT(DISTINCT(shopID)) count 
FROM
(
    SELECT explode(array(
           0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
          10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
          20, 21, 22, 23, 24, 25, 26, 27, 28, 29)) as days
) days_ago 
LEFT JOIN ProductOrder po ON 
(
    DATE_SUB(CURRENT_DATE, days_ago.days) <= po.endtime  
    AND DATE_SUB(CURRENT_DATE, days_ago.days) >= po.starttime 
    AND status = 2
) 
GROUP BY days_ago.days;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...