Pig UDF for iso to yyyy-mm-dd hh:mm:ss.000

6
我想将ISO时间格式转换为yyyy-mm-dd hh:mm:ss.SSS。但是我无法实现转换。我刚接触pig,并试图编写一个UDF来处理从ISO格式到yyyy-mm-dd hh:mm:ss.SSS的转换。
请指导我,我尝试了pig的内置函数(FORMAT,DATE_FORMAT),但无法将数据转换为所需格式。
当前数据格式:2013-08-22T13:23:18.226220+01:00
所需数据格式:2013-08-22 13:23:18.226
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
import org.apache.pig.EvalFunc;
import org.joda.time.DateTime;
import org.joda.time.format.*;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.DateTimeFormatterBuilder;
public class test extends EvalFunc<String>{

public String exec(Tuple input) throws IOException {

    if ((input == null) || (input.size() == 0))
        return null;
    try{
        String time = (String)input.get(0);
         DateFormat dt = new SimpleDateFormat ("yyyy-mm-dd hh:mm:ss.SSS");
         Date d_t = dt.parse(time);
         String timedt = getTimedt(d_t);
         return timedt; 
    } catch (ParseException e) {

        return null;
    }


}

private String getTimedt(Date d_t) {
     DateTimeFormatterBuilder formatter =  new DateTimeFormatterBuilder();   

    } 
}

我该如何在Pig中处理日期转换?


需要使用UDF来执行这个任务吗?我目前也在面临这个问题。我看到一些关于PiggyBank UDF的讨论,可能在0.11版本中不再需要了? - Freerobots
3个回答

7

在Pig 0.11.1中,不需要使用UDF将日期从ISO 8601格式转换为yyyy-mm-dd hh:mm:ss.SSS格式。以下是示例代码,演示如何将一列ISO 8601格式的日期转换为yyyy-MM-dd HH:mm:ss.SSS格式的日期。

converted_dates = FOREACH input_dates GENERATE ToString(date,'yyyy-MM-dd HH:mm:ss.SSS') as date:chararray;


注意:

我认为ToString函数没有文档... 我从这个Google SOC提案中猜测了这个用法:

http://www.google-melange.com/gsoc/proposal/review/google/gsoc2012/zjshen/21002

需要将以下函数从piggybank UDF转换为内置函数。

String ToString(DateTime d, String format)

我猜测它已经被转换了,但还没有进入主要文档。这里是ToString内置类的类文档:http://pig.apache.org/docs/r0.11.1/api/org/apache/pig/builtin/ToString.html。 但我们可以看到apache的pig文档中缺少ToString函数:http://pig.apache.org/docs/r0.11.1/func.html

3
请参考 https://issues.apache.org/jira/browse/PIG-3349 了解更多信息。在该讨论中,他们注意到ToString(datetime, format_string)未被记录在文档中,并为0.12版本提交了文档更改。 - Steven

1

2013-08-22T13:23:18.226220+01:00是XSD dateTime格式,应该按照以下方式解析

XMLGregorianCalendar xc = DatatypeFactory.newInstance().newXMLGregorianCalendar("2013-08-22T13:23:18.226220+01:00");

从XMLGregorianCalendar可以获取GregorianCalendar,然后获取java.util.Date。
GregorianCalendar gc = xc.toGregorianCalendar
Date date = gc.getTime();

请注意,226220是小数秒。如果您尝试使用SimpleDateFormat解析它作为SSS,它将解析为226220毫秒,而不是0.2226220秒。

0
    DateFormat dffrom = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
    DateFormat dfto = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    //TimeZone zone = TimeZone.getTimeZone("America/Los_Angeles");
    //dfto.setTimeZone(zone);
    Date date = dffrom.parse("2013-08-22T13:23:18.226220+01:00");    
    //2013-08-22T13:23:18.226220+01:00
    String s = dfto.format(date);
    System.out.println(s);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接