2016-12-19 2 views
1

Ich war auf der Suche nach Hilfe in Bezug auf eine SQL-Abfrage, die ich in Hive (Hue-Plattform) ausführen möchte und suchte nach einem Rat, um zu sehen, ob Abfrage könnte verkürzt oder anders geschrieben werden, um es schneller laufen zu lassen. Als ich dies ran gegen eine Dummy-Datensatz (1500 Zeilen) in SQL Developer (siehe unten) diese farily schnell läuft und gibt mir, was ich brauche:Abfrage Ages in Hive ausführen, um es zu vereinfachen

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 
    ; 

Leider wenn ich versuche, die gleiche Abfrage in Hive läuft , die Abfrage dauert Ewigkeiten zu laufen und die Max, die ich es für 7 Stunden ausgeführt habe und ich habe immer noch keine Ausgabe. Das Problem ist, dass ich versuche, dies gegen eine Tabelle mit über 300 Millionen Zeilen auszuführen, also die Länge der Zeit, die es in Anspruch nimmt.

Ich beschloss, die Abfragen zu trennen und die erste Unterabfrage in eine Tabelle (Dummy-Daten unten) einzufügen und das war in Ordnung und die Ausgabe habe ich jetzt in einer Untertabelle mit 347 Millionen Zeilen (Dummy-Daten unten zeigt nur 10 Zeilen)

TABLE

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

CREATE Leider hat die anfängliche Tabelle 49 verschiedene Spalten, aber ich habe sele Die 2 Spalten, die ich im obigen Beispiel verwende,

Ich habe festgestellt, dass, wenn die zweite Unterabfrage einsetzen, das Problem liegt in der Aussage aussieht:

SUM(COUNT1) OVER (PARTITION BY P_AGENT, TRUNC(P_DATE) ORDER BY P_DATE) AS GRP, 

Die vollständige Abfrage, die ich hier gezeigt leite:

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 ; 

aber Das braucht Ewigkeiten, um zu laufen und deshalb wollte ich einen Ratschlag geben, um zu sehen, ob es etwas anderes gibt, das ich ausprobieren könnte, da ich daran festhalte, wie ich das jetzt lösen kann.

Die Ausgabe, nach der ich suche, zeigt alle Arbeiten, die ein Agent innerhalb von 30 Minuten abgeschlossen hat.

Ein Beispiel dafür aus meinem Datensatz ist:

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

Eine warme Beratung berechnet - fragen Sie nicht für die Code-Rewrite, statt , zeigen Sie uns Quelldatenmuster und angeforderte Ergebnisse. –

+0

Danke Dudu, ich habe meine Ausgabe hinzugefügt, die ich derzeit benötige. Die Datenstichprobe der Quelle wird im ursprünglichen Post angezeigt. – user3191160

Antwort

0

Keine Notwendigkeit für TOUCH_COUNT, wenn Sie bereits COUNT1 in der vorhergehenden Stufe

+0

Danke Dudu wird Code bearbeiten, um zu sehen, wie lange das dauert. – user3191160

+0

Ich habe erneut die Abfrage und es läuft immer noch nach 2 Stunden, nicht sicher, ob es eine Möglichkeit gibt, zu sehen, wie lange es dauern wird .. – user3191160

+0

Alle Updates? .... –

Verwandte Themen