真的坚持这个!假设我有以下数据集:
A | B
------------------
1/2/12 | 13:3.8
04:4.1 | 12:1.4
15:4.3 | 1/3/13
观察A和B一般采用分钟格式:秒。毫秒,如A是点击,B是响应。如果任何事件碰巧发生在新的一天的开始,有时时间格式有月/日/年的形式。
我想要什么?是计算B和A之间的平均差。我可以很容易地处理m:s.ms,因为每个A和B将它们分成两部分,然后转换为DOUBLE和执行所有需要的操作但是当引入m / d / yy时它都会失败。省略它们的最简单方法,但这不是一个很好的做法。是否有一种明确的方法来使用PIG处理此类异常?
答案 0 :(得分: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;
N.B。我们可以使用ToMilliSeconds()方法代替ToUnixTime。
输出
(1.0569718666666666E7)