2013-07-29 30 views
1

日期,時間範圍內丟失記錄我的形式如何創建的Pig Latin

2013-07-09T19:17Z,f1,f2 
2013-07-09T03:17Z,f1,f2 
2013-07-09T21:17Z,f1,f2 
2013-07-09T16:17Z,f1,f2 
2013-07-09T16:14Z,f1,f2 
2013-07-09T16:16Z,f1,f2 
2013-07-09T01:17Z,f1,f2 
2013-07-09T16:18Z,f1,f2 

的輸入記錄這些代表時間戳和事件。我手寫這些,但實際數據應該根據時間進行排序。

我想生成一組記錄,這些記錄將被輸入到需要連續時間序列的圖形繪圖功能中。我想填寫缺失值,即如果有「2013-07-09T19:17Z」和「2013-07-09T19:19Z」的條目,我想爲「2013-07-09T19:18Z」生成條目「與預定義值。

我就這樣做的想法:

  1. 使用MIN和MAX找到該系列中的開始和結束日期
  2. 寫UDF這需要最小值和最大值,並返回一個缺少 關係時間戳
  3. 加入以上2個關係

我不能讓我的頭在如何實施這個在PIG雖然。將不勝感激任何幫助。

謝謝!

回答

1

使用MIN和MAX之間的所有時間戳(包括MIN和MAX)的腳本(外部豬)生成另一個文件。將其作爲第二個數據集加載。以下是我從數據集中使用的示例。請注意我只填補了很少的差距,並非全部。

2013-07-09T01:17Z,d1,d2 
2013-07-09T01:18Z,d1,d2 
2013-07-09T03:17Z,d1,d2 
2013-07-09T16:14Z,d1,d2 
2013-07-09T16:15Z,d1,d2 
2013-07-09T16:16Z,d1,d2 
2013-07-09T16:17Z,d1,d2 
2013-07-09T16:18Z,d1,d2 
2013-07-09T19:17Z,d1,d2 
2013-07-09T21:17Z,d1,d2 

對原始數據集和上面生成的數據集執行COGROUP。使用嵌套的FOREACH GENERATE編寫輸出數據集。如果第一個數據集爲空,則使用第二個數據集中的值生成輸出數據集,否則返回第一個數據集。這是我在這兩個數據集上使用的一段代碼。

Org_Set = LOAD 'pigMissingData/timeSeries' USING PigStorage(',') AS (timeStamp, fl1, fl2); 
Default_set = LOAD 'pigMissingData/timeSeriesFull' USING PigStorage(',') AS (timeStamp, fl1, fl2); 
coGrouped = COGROUP Org_Set BY timeStamp, Default_set BY timeStamp; 

Filled_Data_set = FOREACH coGrouped { 
    x = COUNT(times); 
    y = (x == 0? (Default_set.fl1, Default_set.fl2): (Org_Set.fl1, Org_Set.fl2)); 
    GENERATE FLATTEN(group), FLATTEN(y.$0), FLATTEN(y.$1); 
}; 

如果你需要進一步澄清或幫助讓我知道

1

除了@Rags的回答,您可以使用STREAM x THROUGH命令和一個簡單的awk腳本(similar to this one)一旦生成日期範圍最小和最大日期。類似於(未經測試的) - 您可能需要使用分號命令分隔單行輸入awk腳本,或者更好地將其作爲腳本文件發送)

grunt> describe bounds; 
(min:chararray, max:chararray) 
grunt> dump bounds; 
(2013/01/01,2013/01/04) 
grunt> fullDateBounds = STREAM bounds THROUGH `gawk '{ 
    split($1,s,"/") 
    split($2,e,"/") 
    st=mktime(s[1] " " s[2] " " s[3] " 0 0 0") 
    et=mktime(e[1] " " e[2] " " e[3] " 0 0 0") 
    for (i=st;i<=et;i+=60*24) print strftime("%Y/%m/%d",i) 
}'`;