2017-04-03 40 views
0

我試圖使用分區將數據加載到Hive表中。分區列與Hive中的當前日期相同

的代碼如下:

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

我剛開了以下錯誤:

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

我嘗試使用

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

,但什麼都沒有改變。

爲什麼它不起作用? 如何將當前日期設置爲分區列?

預先感謝您。

洛倫佐

+0

這是非常令人沮喪的回答你的問題。我強烈建議您在繼續使用Hive之前閱讀一些文檔/教程。 –

回答

0

爲什麼移動文件時,你可以建立在它們之上的外部表?
LOAD DATA INPATH只是將文件(HDFS元數據操作)「按原樣」移動到表的位置。

爲什麼在明確約會時將分區列定義爲字符串?

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

爲什麼你想使用非ISO格式(YYYY.MM.DD)?
ISO日期格式爲YYYY-MM-DD


因爲它似乎分區信息不是數據的一部分,你有3種選擇:


使用常數(不允許表達,包括函數),例如

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

2.
創建一個額外的表,URL_STG,類似於URL但沒有分區,並用它來動態插入的分區。

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

insert into URL select *,current_date from URL_STG; 

供應的日期作爲變量從CLI

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

感謝您的回覆。我很抱歉,這很令人沮喪,我剛開始使用Hive,但是,我不確定我是否明白爲什麼它非常令人沮喪。關於你的問題: 1)我需要移動數據,因爲這是一個更大的腳本的一部分,並且包含數據的文件夾需要爲下一次「迭代」清除。 2)在使用dateformats,unixtimestamp等不成功的嘗試幾個小時後,「串」結束了,對此抱歉。 3)沒有特別的原因,只是不知道複製/過去,感謝有關ISO的信息。 是否可以從函數定義常量? 謝謝 – lorenzotenti

+0

分區列的類型是字符串。分區列的名稱是'dt',它代表「日期」。實際值是一個時間戳(直到秒級)。格式不是ISO。在錯誤中使用除常量以外的任何分區聲明。動態分區與'load inpath'無關。你在哪裏開始處理這個職位? :-) ...和不,你不能使用任何東西,但文字 –