2017-03-02 5 views
0

können Sie mir helfen, die Fehler zu überwinden, die ich erhalte, wenn ich versuche, die folgende Tabelle zu erstellen?Hive erstellt Tabellenfehler.

Dank

CREATE TABLE RANGE_FT (HOSP_VAR STRING, RANGE INT) 
AS 
      SELECT 'EMR' ,MAX(emr_avg_score) - MIN(emr_avg_score) from JOIN9 
    UNION SELECT 'SCI' ,MAX(sci_avg_score) - MIN(sci_avg_score) from JOIN9 
    UNION SELECT 'ASTH' ,MAX(asth_avg_score) - MIN(asth_avg_score) from JOIN9 
    UNION SELECT 'HF' ,MAX(hf_avg_score) - MIN(hf_avg_score) from JOIN9 
    UNION SELECT 'SC' ,MAX(sc_avg_score) - MIN(sc_avg_score) from JOIN9 
    UNION SELECT 'PNEU' ,MAX(pneu_avg_score) - MIN(pneu_avg_score) from JOIN9 
    UNION SELECT 'PREV' ,MAX(prev_avg_score) - MIN(prev_avg_score) from JOIN9 
    UNION SELECT 'BC' ,MAX(BC_avg_score) - MIN(BC_avg_score) from JOIN9 
    UNION SELECT 'HEART' ,MAX(heart_avg_score) - MIN(heart_avg_score) from JOIN9 
    UNION SELECT 'PREG' ,MAX(preg_avg_score) - MIN(preg_avg_score) from JOIN9 
; 

Linie 7: 6 ALL auf 'SELECT'

+0

try SET NOCOUNT vor Abfrage –

+0

Bitte ersetzen Sie das Bild mit einem Text (nachdem Sie es einzufügen, wählen Sie es aus und drücken Sie Strg + k zu formatieren, um es zu Code) –

+0

Hallo Singh, danke für Eure Hilfe. Können Sie genauer erklären, wie Nocount gesetzt wird? Ich meine, wo ich diesen Befehl setzen sollte. Mein Code ist: DROP TABLE RANGE_FT; CREATE TABLE RANGE_FT (HOSP_VAR STRING, RANGE INT) AS SELECT 'EMR', MAX (emr_avg_score) - MIN (emr_avg_score) von JOIN9 UNION SELECT 'SCI', MAX (sci_avg_score) - MIN (sci_avg_score) aus JOIN9 UNION SELECT 'ASTH', MAX (asth_avg_score) - MIN (asth_avg_score) von JOIN9 UNION SELECT 'HF', MAX (hf_avg_score) - MIN (hf_avg_score) von JOIN9; –

Antwort

1
  1. UNION fehlt nicht von Ihrer Hive-Version nicht unterstützt (und es ist auch nicht das, was Sie brauchen Hier).
    Verwenden Sie stattdessen UNION ALL. https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Union

  2. UNION [ALL] erfordert gleiches Schema von beiden Seiten.
    In Hive sollten im Gegensatz zu anderen SQL-Dialekten nicht nur die Typen ähnlich sein, sondern auch die Spaltenaliase.

  3. Sie können in Ihrer create-Anweisung keine Spaltenliste angeben.
    Fügen Sie der SELECT-Klausel die relevanten Aliase hinzu.


Dies ist eine feste Version der Anfrage

CREATE TABLE RANGE_FT 
AS 
       SELECT 'EMR' as HOSP_VAR ,MAX (emr_avg_score) - MIN (emr_avg_score) as RANGE from JOIN9 
    UNION ALL SELECT 'SCI' as HOSP_VAR ,MAX (sci_avg_score) - MIN (sci_avg_score) as RANGE from JOIN9 
    UNION ALL SELECT 'ASTH' as HOSP_VAR ,MAX (asth_avg_score) - MIN (asth_avg_score) as RANGE from JOIN9 
    UNION ALL SELECT 'HF' as HOSP_VAR ,MAX (hf_avg_score) - MIN (hf_avg_score) as RANGE from JOIN9 
    UNION ALL SELECT 'SC' as HOSP_VAR ,MAX (sc_avg_score) - MIN (sc_avg_score) as RANGE from JOIN9 
    UNION ALL SELECT 'PNEU' as HOSP_VAR ,MAX (pneu_avg_score) - MIN (pneu_avg_score) as RANGE from JOIN9 
    UNION ALL SELECT 'PREV' as HOSP_VAR ,MAX (prev_avg_score) - MIN (prev_avg_score) as RANGE from JOIN9 
    UNION ALL SELECT 'BC' as HOSP_VAR ,MAX (BC_avg_score) - MIN (BC_avg_score) as RANGE from JOIN9 
    UNION ALL SELECT 'HEART' as HOSP_VAR ,MAX (heart_avg_score) - MIN (heart_avg_score) as RANGE from JOIN9 
    UNION ALL SELECT 'PREG' as HOSP_VAR ,MAX (preg_avg_score) - MIN (preg_avg_score) as RANGE from JOIN9 
; 

Und hier ist eine alternative Lösung mit nur einer einzigen SELECT

create table RANGE_FT 
as 
select inline 
     (
      array 
      (
       struct ('EMR' ,MAX (emr_avg_score) - MIN (emr_avg_score) ) 
       ,struct ('SCI' ,MAX (sci_avg_score) - MIN (sci_avg_score) ) 
       ,struct ('ASTH' ,MAX (asth_avg_score) - MIN (asth_avg_score)) 
       ,struct ('HF' ,MAX (hf_avg_score) - MIN (hf_avg_score) ) 
       ,struct ('SC' ,MAX (sc_avg_score) - MIN (sc_avg_score) ) 
       ,struct ('PNEU' ,MAX (pneu_avg_score) - MIN (pneu_avg_score)) 
       ,struct ('PREV' ,MAX (prev_avg_score) - MIN (prev_avg_score)) 
       ,struct ('BC' ,MAX (BC_avg_score) - MIN (BC_avg_score) ) 
       ,struct ('HEART' ,MAX (heart_avg_score) - MIN (heart_avg_score)) 
       ,struct ('PREG' ,MAX (preg_avg_score) - MIN (preg_avg_score)) 
      ) 
     ) as (HOSP_VAR,RANGE) 

from JOIN9  
; 
+0

Ich habe einen Fehler erhalten FAILED: SemanticException [Fehler 10065]: CREATE TABLE AS SELECT-Befehl kann nicht die Liste der Spalten für die Zieltabelle –

+0

Ich habe es gerade in Text veröffentlicht. Vielen Dank für Ihre Hilfe Dudu –

+0

Hallo Dudu, könnten Sie mir Ihre Magie zeigen, wie man diesen Tisch erstellt? Vielen Dank für Ihre Antwort. –

0

Diese Arbeit wird Wie von Dudu erwähnt, können Sie den Spaltennamen w nicht angeben hile schreiben erstellen mit auswählen. Sie können Union verwenden, aber leistungsfähiger UNION ALL ist besser. Wählen Sie auf der Grundlage Ihrer usecase

CREATE TABLE RANGE_FT 
AS 
      SELECT 'EMR' AS HOSP_VAR ,MAX(emr_avg_score) - MIN(emr_avg_score) AS `RANGE` from JOIN9 
    UNION SELECT 'SCI' AS HOSP_VAR ,MAX(sci_avg_score) - MIN(sci_avg_score) AS `RANGE` from JOIN9 
    UNION SELECT 'ASTH' AS HOSP_VAR ,MAX(asth_avg_score) - MIN(asth_avg_score) AS `RANGE` from JOIN9 
    UNION SELECT 'HF' AS HOSP_VAR ,MAX(hf_avg_score) - MIN(hf_avg_score) AS `RANGE` from JOIN9 
    UNION SELECT 'SC' AS HOSP_VAR ,MAX(sc_avg_score) - MIN(sc_avg_score) AS `RANGE` from JOIN9 
    UNION SELECT 'PNEU' AS HOSP_VAR ,MAX(pneu_avg_score) - MIN(pneu_avg_score) AS `RANGE` from JOIN9 
    UNION SELECT 'PREV' AS HOSP_VAR ,MAX(prev_avg_score) - MIN(prev_avg_score) AS `RANGE` from JOIN9 
    UNION SELECT 'BC' AS HOSP_VAR ,MAX(BC_avg_score) - MIN(BC_avg_score) AS `RANGE` from JOIN9 
    UNION SELECT 'HEART' AS HOSP_VAR ,MAX(heart_avg_score) - MIN(heart_avg_score) AS `RANGE` from JOIN9 
    UNION SELECT 'PREG' AS HOSP_VAR ,MAX(preg_avg_score) - MIN(preg_avg_score) AS `RANGE` from JOIN9 
; 
+0

Hallo Ashish, danke für deine Hilfe. aber selbst ich lösche den Spaltennamen und führe den Code aus, der Fehler zeigt immer noch folgendes an: FAILED: ParseException Zeile 4:12 fehlt ALL bei 'SELECT' in der Nähe von '' Zeile 5:12 fehlt ALL bei 'SELECT' nahe '' –

+0

@QingZhang Bitte alias den Spaltennamen und setzen Sie die Spalte Range in Backslash ' –

Verwandte Themen