Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hive 如何将此MYSQL SQL转换为配置单元SQL_Hive_Hiveql - Fatal编程技术网

Hive 如何将此MYSQL SQL转换为配置单元SQL

Hive 如何将此MYSQL SQL转换为配置单元SQL,hive,hiveql,Hive,Hiveql,表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 我不想查询两天之间的有效店铺计数和最近一个月的每天计数,有效店铺计数意味着starttime配置单元不支持非对等连接条件

表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
我不想查询两天之间的有效店铺计数和最近一个月的每天计数,有效店铺计数意味着starttime配置单元不支持非对等连接条件,可以将它们放在WHERE子句中。使用堆栈而不是许多联合子查询

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);

支持ON子句中的复杂表达式,从Hive 2.2.0开始。请参阅。@Iskuskov,谢谢,这是有用的信息。不幸的是,我有Hive1.2.0,无法检查它是如何工作的。不客气!使用配置单元2.3.3成功执行脚本
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;
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;
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);