使用PIG

时间:2015-09-21 07:54:09

标签: hadoop apache-pig cloudera

真的坚持这个!假设我有以下数据集:

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处理此类异常?

1 个答案:

答案 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)