我正在寻找一些关于我试图在Hive(Hue平台)中运行的SQL查询的帮助,并且正在寻找一些建议,以查看查询是否可以缩短或以不同方式编写以使其更快地运行。当我在SQL Developer中针对虚拟数据集(1500行)运行它(见下文)时,它可以快速运行并提供我需要的内容:
SELECT
P_AGENT,
TRUNC(P_DATE) AS P_DATE,
SUM(TOUCH_COUNT) AS TOUCH_COUNT,
MIN(P_DATE) AS START_TIME,
MAX(P_DATE) AS END_TIME,
MAX(P_DATE) - MIN(P_DATE) AS TIME_TAKEN
FROM
(
SELECT
T1.*,
SUM(COUNT1) OVER (PARTITION BY P_AGENT, TRUNC(P_DATE) ORDER BY P_DATE) AS GRP,
CASE
WHEN P_DATE - LAG(P_DATE) OVER (PARTITION BY P_AGENT, TRUNC(P_DATE) ORDER BY P_DATE) <= 1 / 48
THEN NULL
ELSE 1
END AS TOUCH_COUNT
FROM
(
SELECT
T1.*,
(CASE WHEN P_DATE - LAG(P_DATE) OVER (PARTITION BY P_AGENT, TRUNC(P_DATE) ORDER BY P_DATE) <= 1/48
THEN 0 ELSE 1
END) AS COUNT1
FROM
TABLE2 T1
) T1
) T1
GROUP BY
P_AGENT, TRUNC(P_DATE), GRP
ORDER BY
P_DATE
;
不幸的是,当我尝试在Hive中运行相同的查询时,查询需要花费很长时间才能运行,并且我运行它的最大值是7小时,我仍然没有输出。问题是我试图在一个有超过3亿行的表上运行它,因此需要花费很长时间。
我决定拆分查询并将初始子查询放入一个表(下面显示的虚拟数据)中这很好,输出我现在在一个有3.47亿行的子表中(下面的虚拟数据只显示10行) )
创建表
CREATE TABLE "TIME_ISSUES"
(
"P_DATE" DATE,
"P_AGENT" VARCHAR2(8 BYTE),
"COUNT1" NUMBER(5,0)
)
INSERT STATEMENTS
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('05-APR-16 20:20:12','DD-MON-RR HH24:MI:SS'),'CLQRC0',1);
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('07-APR-16 15:06:09','DD-MON-RR HH24:MI:SS'),'SMCXF3',1);
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('08-APR-16 04:33:00','DD-MON-RR HH24:MI:SS'),'EAQGH1',1);
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('08-APR-16 12:17:53','DD-MON-RR HH24:MI:SS'),'JMENJDS',1);
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('09-APR-16 13:06:53','DD-MON-RR HH24:MI:SS'),'JMENJDS',1);
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('11-APR-16 10:41:00','DD-MON-RR HH24:MI:SS'),'NUKXY3',1);
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('12-APR-16 10:15:21','DD-MON-RR HH24:MI:SS'),'JMRJADS',1);
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('12-APR-16 11:19:23','DD-MON-RR HH24:MI:SS'),'CLMXB1',1);
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('15-APR-16 08:36:00','DD-MON-RR HH24:MI:SS'),'EMA0L1',1);
Insert into TIME_ISSUES (P_DATE,P_AGENT,COUNT1) values (to_date('22-APR-16 16:22:00','DD-MON-RR HH24:MI:SS'),'EADBM1',1);
不幸的是,初始表有49个不同的列,但我选择了上面示例中使用的2列。
我发现在运行第二个子查询时,它看起来问题在于语句:
SUM(COUNT1) OVER (PARTITION BY P_AGENT, TRUNC(P_DATE) ORDER BY P_DATE) AS GRP,
我正在运行的完整查询显示在此处:
SELECT T1.*,
SUM(COUNT1) OVER (PARTITION BY P_AGENT, TO_DATE(P_DATE) ORDER BY P_DATE) AS GRP,
CASE
WHEN P_DATE - LAG(P_DATE) over (PARTITION BY P_RECR, TO_DATE(P_DATE) ORDER BY P_DATE) <= 1 / 48
THEN NULL
ELSE 1
END AS TOUCH_COUNT
FROM TIME_ISSUES T1 ;
但是这需要很长时间才能运行,因此我想提出一些建议,看看是否有任何不同我可以尝试,因为我现在仍然坚持如何解决这个问题。
我正在寻找的输出将显示代理在30分钟时间内完成的所有工作。
我的数据集的一个例子是:
P_AGENT | P_DATE | TOUCH_COUNT | START_TIME | END _TIME | TIME_TAKEN
JMRJADS | 12-APR-16 | 1 | 12-APR-16 10:15:21 | 12-APR-16 10:15:21 | 0
答案 0 :(得分:0)
在前一阶段计算过COUNT1时,无需TOUCH_COUNT