2015-09-21 47 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

相关问题