我有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
我是猪脚本的初学者。如果您遇到过这种错误,请告诉我如何解决。
答案 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)