2017-08-10 68 views
0

我想將yyyyMMdd格式轉換爲使用pig的yyyy/MM/dd格式,因爲我寫了下面的代碼。無效的格式:「19690321」太短

代碼:

STOCK_A = LOAD '/user/root/xxxx/*' USING PigStorage('|'); 
data = FILTER STOCK_A BY ($1 matches '.*ID.*'); 
MSH_DATA = FOREACH data GENERATE ToDate($8,'yyyy/MM/dd','UTC') AS dob; 

當我試圖轉儲結果我收到以下錯誤。

ERROR org.apache.pig.tools.pigstats.SimplePigStats - ERROR 0:執行 異常[POUserFunc(名稱: POUserFunc(org.apache.pig.builtin.ToDate3ARGS)[日期時間] - scope- 209 操作按鍵:範圍-209)兒童:空在[]: java.lang.IllegalArgumentException異常:無效的格式爲: 「19690321」 太 短

樣品:

[email protected]#PDULD21F|ID|1|483|1020783||[email protected]#PDULD||19690321|F| 

8美元似乎對我有效我無法找到問題的原因即將到來。任何幫助將非常感激。

回答

1

您使用:

ToDate($8,'yyyy/MM/dd','UTC') 

但格式

19690321 

,所以你應該有

ToDate($8,'yyyyMMdd','UTC') 
+0

之前將其轉換爲chararray,但我想日期是從年月日YYYY/MM/DD格式。我怎麼能做到這一點? – Ironman

+0

該todate將您的字符串轉換爲日期。 Pig會知道格式是日期,你將能夠做到這一點(計算年齡,2日期之間的選擇行...)如果你想打印回你的日期,你必須轉換回ToString的字符串。例如,您可以使用「ToString(yourDate,'yyyy/MM/dd')」。或者甚至是「ToString(yourDate,'ww-yyyy')」來獲得週數。 – wargre

1

的問題是,因爲負載statement.Since你是最有可能沒有指定模式,數據類型默認爲bytearray。你將不得不通過現場TODATE

STOCK_A = LOAD '/user/root/xxxx/*' USING PigStorage('|'); 
data = FILTER STOCK_A BY ($1 matches '.*ID.*'); 
MSH_DATA = FOREACH data GENERATE ToDate((chararray)$8,'yyyy/MM/dd','UTC') AS dob;