在pig中使用正则表达式进行日期验证 - 获取ERROR 1003:无法找到别名的运算符

时间:2014-10-03 16:48:13

标签: regex date datetime apache-pig

我有sampledata.csv,其中包含如下数据,

2,4 / 1 / 2010,5.97

2,4 / 6 / 2010,12.71

2,4 / 7 / 2010,34.52

2,4 / 12 / 2010,7.89

2,4 / 14 / 2010,17.17

2,4 / 16 / 2010,9.25

2,4 / 19 / 2010,26.74

我想过滤pig脚本中的数据,以便只考虑具有有效日期的数据。 假设日期类似于' 4 // 2010'或者' / 9/2010',然后必须将其过滤掉。

下面是我编写的猪脚本以及转储数据时得到的输出。

脚本:

data = load 'sampledata.csv' using PigStorage(',') as (custid:int, date:chararray,amount:float);

cleadata = FILTER data by REGEX_EXTRACT(date, '(([1-9])|(1[0-2]))/(([0-2][1-9])|([3][0-1]))/([1-9]{4})', 1) != null;

输出:

2014-09-14 18:21:30,587 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1003: Unable to find an operator for alias cleandata

我是猪脚本的初学者。如果您遇到过这种错误,请告诉我如何解决。

1 个答案:

答案 0 :(得分:1)

这里是你的问题的解决方案。我也修改了正则表达式,如果你想要你可以根据需要改变正则表达式。

input.txt中

2,04/1/0000,5.97
2,04/1/2010,5.97
2,44/6/2010,12.71
2,4/07/2010,34.52
2,4/\12/2010,7.89
2,4/14/2010/,17.17
2,/16/2010,9.25
2,4/19//2010,26.74
2,4//19/2010,26.74

PigScript:
A = LOAD 'input.txt' USING PigStorage(',') AS (custid:int,date:chararray,amount:float);
B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(date, '(0?[1-9]|1[0-2])/([1-2][0-9]|[3][0-1]|0?[1-9])/([1-2][0-9]{3})')) AS (month,day,year);
C = FOREACH B GENERATE CONCAT(month,'/',day,'/',year) AS extractedDate;
D = FILTER C BY extractedDate is not null;
DUMP D;

Output:
(04/1/2010)
(4/07/2010)