2014-01-31 10 views
7

Ich versuche, eine neue Tabelle aus einer anderen Tabelle mit CREATE AS und dynamische Partitionierung auf HiveCLI zu erstellen. Ich bin von Hive offiziellen Wiki zu lernen, wo es dieses Beispiel ist:Dynamische Partitionierung + CREATE AS auf HIVE

CREATE TABLE T (key int, value string) 
PARTITIONED BY (ds string, hr int) AS 
SELECT key, value, ds, hr+1 hr1 
    FROM srcpart 
    WHERE ds is not null 
    And hr>10; 

Aber ich erhielt diesen Fehler:

FAILED: SemanticException [Error 10065]:

CREATE TABLE AS SELECT command cannot specify the list of columns for the target table

Quelle: https://cwiki.apache.org/confluence/display/Hive/DynamicPartitions#DynamicPartitions-Syntax

Antwort

16

Da Sie bereits wissen, das gesamte Schema der Zieltabelle, versuche sie zuerst zu erstellen und sie mit einem Befehl LOAD DATA zu füllen:

SET hive.exec.dynamic.partition.mode=nonstrict; 

CREATE TABLE T (key int, value string) 
PARTITIONED BY (ds string, hr int); 

INSERT OVERWRITE TABLE T PARTITION(ds, hr) 
SELECT key, value, ds, hr+1 AS hr 
    FROM srcpart 
    WHERE ds is not null 
    And hr>10; 

Hinweis: Der Befehl set wird benötigt, da Sie eine vollständige dynamische Partition einfügen.

+0

Ja, ich habe es getan, es scheint die beste und einzigartige Lösung –

+4

Was ist der beste Weg, dies zu tun, wenn Sie nicht bereits das vollständige Schema der Zieltabelle * kennen *? Ist es möglich, eine partitionierte Tabelle aus einer nicht partitionierten Tabelle zu generieren, die nur Hive-Abfragen verwendet? – Noah

2
SET hive.exec.dynamic.partition.mode=nonstrict; 

CREATE TABLE T (key int, value string) 
PARTITIONED BY (ds string, hr int); 

INSERT OVERWRITE TABLE T PARTITION(ds, hr) 
SELECT key, value, ds, hr+1 AS hr 
FROM srcpart 
WHERE ds is not null 
     And hr>10; 

In dem obigen Code anstelle der Create Anweisung Verwendung: CREATE TABLE T like srcpart;

Falls die Partitionierung ähnlich ist.