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

    } 
}

我如何处理猪的日期转换?

4

3 回答 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 日期。

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


笔记:

我认为没有记录 ToString 函数......我从这个谷歌 SOC 提案中猜到了这种用法:

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

其中提到以下函数需要从存钱罐 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

于 2013-09-11T06:25:57.947 回答
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 毫秒,它将是 226 秒 220 毫秒而不是 0.2226220 秒

于 2013-09-06T11:58:50.717 回答
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);
于 2013-09-06T11:51:26.250 回答