2017-04-03 2 views
0

Ich versuche, Daten in eine Hive Tabellenpartition mit zu laden.Partition Spalt gleich aktuelles Datum in Hive

Der Code ist wie folgt:

CREATE EXTERNAL TABLE URL(url STRING, clicks INT) 
COMMENT 'Unique Clicks per URL' 
PARTITIONED BY(dt STRING) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t' 
LINES TERMINATED BY '\n' 
STORED AS TEXTFILE 
LOCATION '/mypath/URL'; 

LOAD DATA INPATH '/inputpath/' INTO TABLE URL 
PARTITION (dt=date_format(CURRENT_TIMESTAMP, "yyyy.MM.dd HH:mm:ss")); 

ich folgende Fehlermeldung bin Gettin:

FAILED: ParseException line 4:14 cannot recognize input near 
'date_format' '(' 'CURRENT_TIMESTAMP' in constant 

Ich versuchte

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

aber nichts geändert.

Warum funktioniert es nicht? Wie setze ich das aktuelle Datum als Partitionsspalte?

Vielen Dank im Voraus.

Lorenzo

+0

Es war sehr frustrierend Ihre Frage zu beantworten. Ich schlage vor, dass Sie einige Dokumentationen/Tutorials lesen, bevor Sie mit der Arbeit an Hive fortfahren. –

Antwort

0

Warum die Dateien verschieben, wenn Sie die externe Tabelle auf ihnen schaffen?
LOAD DATA INPATH bewegt sich nur die Dateien (HDFS Metadatenoperation) „wie sie ist“, um die Lage der Tabelle.

Warum die Partitionsspalte als String definieren, wenn es eindeutig ein Datum?

CREATE EXTERNAL TABLE URL ... PARTITIONED BY(dt DATE) ... 

Warum versuchen Sie nicht-ISO-Formate (YYYY.MM.DD) zu benutzen?
ISO-Datumsformat ist yyyy-MM-dd


Da es die Partitionsinformationen scheint nicht Teil der Daten, die Sie 3 Möglichkeiten:

1.
eine Konstante verwenden (kein Ausdruck erlaubt, einschließlich Funktionen), z

LOAD DATA INPATH '/inputpath/' INTO TABLE URL PARTITION (dt=date '2017-03-04'); 

2.
Erstellen Sie eine zusätzliche Tabelle, URL_STG, ähnlich wie URL aber ohne Partition und es verwenden, um die Partitionen dynamisch einzufügen.

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

insert into URL select *,current_date from URL_STG; 

3.

Versorgung das Datum als Variable vom CLI

hive --hivevar dt=$(date +"%Y-%m-%d") -e \ 
'LOAD DATA INPATH '\''/inputpath/'\'' INTO TABLE URL PARTITION (dt=date '\''${hivevar:dt}'\'')' 
+0

Danke für Ihre Antwort. Es tut mir leid, es war frustrierend, ich habe gerade angefangen, Hive zu benutzen, aber ich bin mir nicht sicher, ob ich verstanden habe, warum es so frustrierend war. Über Ihre Fragen: 1) Ich muss die Daten verschieben, da dies Teil eines größeren Skripts ist und der Ordner mit den Daten für die nächste "Iteration" gelöscht werden muss. 2) Der "String" endete dort nach Stunden erfolgloser Versuche mit Dateformats, unixtimestamp und so weiter, sorry dafür. 3) Kein besonderer Grund, nur aware Kopie/Vergangenheit, danke für die Info über die ISO. Ist es möglich, eine Konstante aus einer Funktion zu definieren? Danke – lorenzotenti

+0

Der Typ der Partition Spalte ist Zeichenfolge. Der Name der Partitionsspalte lautet "dt", was für "date" steht. Der tatsächliche Wert ist ein Zeitstempel (bis zur Sekundenstufe). Das Format ist nicht ISO. Die Verwendung von alles außer einer Konstante für die Partitionsdeklaration in einem Fehler. Dynamische Partitionen haben nichts mit 'Lade Datenpfad' zu tun. Wo fangen Sie an, sich mit diesem Posten zu beschäftigen? :-) ... und nein, du kannst nichts anderes als Literale verwenden –