iso至yyyy mm dd hh:mm:ss.000的清管器自定义项

vlurs2pr  于 2021-06-24  发布在  Pig
关注(0)|答案(3)|浏览(296)

我希望将iso时间格式转换为yyyy-mm-dd hh:mm:ss.sss。然而,我无法实现转换。我是新来的Pig和我试图写一个自定义项来处理从iso格式转换为yyyy-mm-dd-hh:mm:ss.sss。
请指导我,我尝试了pig(format,date\u 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中的日期转换?

mrphzbgm

mrphzbgm1#

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);
ndh0cuux

ndh0cuux2#

2013-08-22t13:23:18.226220+01:00是xsd日期时间格式,应该这样解析

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毫秒,它将是226秒220毫秒,而不是0.2226220秒

lstz6jyr

lstz6jyr3#

对于pig 0.11.1,从iso 8601格式转换为yyyy-mm-dd hh:mm:ss.sss格式不需要自定义项。下面的代码示例演示如何将iso 8601格式的日期列转换为yyyy-mm-dd hh:mm:ss.sss日期。
converted_dates=foreach input_dates生成tostring(date,'yyyyy-mm-dd hh:mm:ss.sss')作为date:chararray;
注:
我不认为tostring函数是有文档记录的。。。我从这个google soc提案中猜到了这个用法:
http://www.google-melange.com/gsoc/proposal/review/google/gsoc2012/zjshen/21002
其中提到以下函数需要从piggybank自定义项转换为内置函数。

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

相关问题