2015-09-21 83 views
1

真的停留在這!假設我有一個以下數據集:轉換日期以毫秒爲單位使用PIG

A  | B 
------------------ 
1/2/12 | 13:3.8 
04:4.1 | 12:1.4 
15:4.3 | 1/3/13 

觀測A和B是在普通的格式分鐘:如A seconds.milliseconds是點擊和B是一個響應。如果任何事件恰巧在新的一天開始,有時候時間格式會有月/日/年的形式。

我想要什麼?是計算B和A之間的平均差。我可以輕鬆處理m:s.ms,將它們分爲兩部分,每部分A和B,然後轉換爲DOUBLE並執行所有必需的操作,但當m/d/yy介紹。最簡單的方法來省略它們,但這不是一個很好的做法。是否有清楚的方法來處理使用PIG的這種例外情況?

+0

爲什麼不寫一些UDF這樣做呢?這很容易在JAVA – Mzf

+0

中做到這一點我只是想知道如果我可以使用標準的Pig庫或方法來做到這一點,而不是現在編寫我自己的實現。 – madbitloman

+0

@madbitloman:通過使用Pig的字符串和日期函數添加了一個答案,嘗試併爲此處理您的用例。 –

回答

1

一個想法值得考慮....

參考:http://pig.apache.org/docs/r0.12.0/func.html所使用的字符串和日期函數。

輸入:

1/2/12|13:3.8 
04:4.1|12:1.4 
15:4.3|1/3/13 

豬腳本:

A = LOAD 'input.csv' USING PigStorage('|') AS (start_time:chararray,end_time:chararray); 
B = FOREACH A GENERATE (INDEXOF(end_time,'/',0) > 0 AND LAST_INDEX_OF(end_time,'/') > 0 AND (INDEXOF(end_time,'/',0) != LAST_INDEX_OF(end_time,'/')) 
       ? (ToUnixTime(ToDate(end_time,'MM/dd/yy'))) : (ToUnixTime(ToDate(end_time,'mm:ss.S')))) - 
       (INDEXOF(start_time,'/',0) >0 AND LAST_INDEX_OF(start_time,'/') > 0 AND (INDEXOF(start_time,'/',0) != LAST_INDEX_OF(start_time,'/')) 
       ? (ToUnixTime(ToDate(start_time,'MM/dd/yy'))) : (ToUnixTime(ToDate(start_time,'mm:ss.S')))) AS diff_time; 
C = FOREACH (GROUP B ALL) GENERATE AVG(B.diff_time); 
DUMP C; 

注:代替ToUnixTime,我們可以使用ToMilliSeconds()方法。

輸出:

(1.0569718666666666E7) 
+0

哇,會試試這個! – madbitloman

相關問題