猪的Java UDF日期正则表达式提取器?

时间:2014-11-12 23:26:43

标签: java apache-pig

我正在尝试创建一个UDF,用于导入到与日期上的Regex模式匹配的Pig。正则表达式已经过测试并相应地工作,但我遇到以下代码时出现问题:

package com.date.format;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
public class DATERANGE extends EvalFunc<String> {

@Override
public String exec(Tuple arg0) throws IOException {
       try
        {
            String pattern = "(Oct\\W(?:1[5-9]|2[0-3])\\W(?:(?:0?9|10):\\d{2}:\\d{2}|11:00:00))";
            Pattern pat = Pattern.compile(pattern);
            Matcher match = pat.matcher((String) arg0.get(0));
            if(match.find())
            {
                return match.group(0);
            }
            else return "none";
        }
        catch(Exception e)
        {
            throw new IOException("Caught exception processing input row ", e);
        }
    }
}

编译上面的java代码并将其导出为jar并使用以下Pig脚本在Hadoop中运行它之后:

register 'DATEFormat.jar';

ld = LOAD 'dates/date_data_three' AS (date:chararray);
loop = foreach ld generate com.date.format.DATERANGE(date) as d:chararray;
dump loop;

我收到以下错误:

ERROR 2078: Caught error from UDF: com.date.format.DATERANGE [Caught exception   
processing  input row ]
org.apache.pig.impl.logicalLayer.FrontendException: ERROR 1066: Unable to open iterator     
for alias loop
at org.apache.pig.PigServer.openIterator(PigServer.java:912)
at org.apache.pig.tools.grunt.GruntParser.processDump(GruntParser.java:752)
at org.apache.pig.tools.pigscript.parser.PigScriptParser.parse(PigScriptParser.java:372)
at org.apache.pig.tools.grunt.GruntParser.loadScript(GruntParser.java:566)
at org.apache.pig.tools.grunt.GruntParser.processScript(GruntParser.java:513)
at          org.apache.pig.tools.pigscript.parser.PigScriptParser.
Script(PigScriptParser.java:1014)    
at org.apache.pig.tools.pigscript.parser.PigScriptParser.parse(PigScriptParser.java:550)
at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:228)
at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:203)
at org.apache.pig.tools.grunt.Grunt.run(Grunt.java:66)
at org.apache.pig.Main.run(Main.java:542)
at org.apache.pig.Main.main(Main.java:156)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.util.RunJar.main(RunJar.java:212)
Caused by: org.apache.pig.PigException: ERROR 1002: Unable to store alias loop
at org.apache.pig.PigServer.storeEx(PigServer.java:1015)
at org.apache.pig.PigServer.store(PigServer.java:974)
at org.apache.pig.PigServer.openIterator(PigServer.java:887)
... 16 more

数据文件包含如下所示的日期:

Wed Oct 15 09:26:09 BST 2014
Wed Oct 15 19:26:09 BST 2014
Wed Oct 18 08:26:09 BST 2014
Wed Oct 23 10:26:09 BST 2014
Sun Oct 05 09:26:09 BST 2014
Wed Nov 20 19:26:09 BST 2014

有没有人知道实现Java UDF的正确方法,可以使用我提供的Regex吗?

由于

2 个答案:

答案 0 :(得分:1)

我建议您使用 REGEX_EXTRACT 内置命令,这将非常简单,而不是编写UDF。

ld = LOAD 'input.txt' AS (date:chararray);
loop = foreach ld generate REGEX_EXTRACT(date,'(Oct\\W(?:1[5-9]|2[0-3])\\W(?:(?:0?9|10):\\d{2}:\\d{2}|11:00:00))',1) as d:chararray;
C = FILTER loop by d is not null;
D = FOREACH C GENERATE $0;
DUMP D;

<强>输出:

(Oct 15 09:26:09)
(Oct 23 10:26:09)

你的正则表达式UDF也适合我。我刚刚复制了你的输入和java代码并在本地执行。它完美地运作。请参阅我从UDF代码获得的以下输出。我想你可能需要检查你的类路径是否正确设置。

(Oct 15 09:26:09)
(none)
(none)
(Oct 23 10:26:09)
(none)
(none) 

答案 1 :(得分:0)

更好的是,您可以使用ToDate

将您的数据加载到filtered_raw_financings_csvs,并将close_date作为标题:

financings_csvs = FOREACH filtered_raw_financings_csvs
                  GENERATE name,
                           city,
                           state,
                           (close_date==''?NULL:ToDate(close_date, 'dd-MMM-yy')) AS close_date
;

按照此处所述构建日期格式字符串:

http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

此代码段显示在上下文中:

http://nathan.vertile.com/blog/2015/04/17/handling-dates-in-hadoop-pig/