Datetime Pig中的自由日期/时间解析

Datetime Pig中的自由日期/时间解析,datetime,apache-pig,jodatime,Datetime,Apache Pig,Jodatime,有关 哎,, 我们正在处理一个包含混合日期格式的pig列:对于某些记录,它是09/11/2004 00:00:00,对于某些记录,它是09/11/2004 00:00:00.000000 我们尝试使用pig11-ToDate解析它,它在内部使用jodatime的DateTimeFormat.forPatternDataType.toStringinput.get1 MM/dd/yyyy HH:MM:ss我们得到的格式无效:1969年12月31日00:00:00在org.joda.time.for

有关

哎,, 我们正在处理一个包含混合日期格式的pig列:对于某些记录,它是09/11/2004 00:00:00,对于某些记录,它是09/11/2004 00:00:00.000000

我们尝试使用pig11-ToDate解析它,它在内部使用jodatime的DateTimeFormat.forPatternDataType.toStringinput.get1

MM/dd/yyyy HH:MM:ss我们得到的格式无效:1969年12月31日00:00:00在org.joda.time.format.DateTimeFormatter.parseDateTime太短

MM/dd/yyyy HH:MM:ss.000000我们得到的格式无效:09/25/2009 00:00:00.000000在.000000处格式不正确

你能建议一个同时处理这两个问题的时间格式吗?我们需要使用自定义ToDate函数吗? 谢谢

您可以使用DateTimeFormatterBuilder通过一个可选部分来实现这一点:

import org.joda.time.format.*;

class Test {
    private static final DateTimeFormatter formatter =
        new DateTimeFormatterBuilder()
            .appendPattern("MM/dd/yyyy HH:mm:ss")
            .appendOptional(DateTimeFormat.forPattern(".SSSSSS").getParser())
            .toFormatter();

    public static void main(String args[]) {
        testParse("09/11/2004 00:00:00");
        testParse("09/11/2004 00:00:00.000000");
    }

    private static void testParse(String input) {
        System.out.println(formatter.parseLocalDateTime(input));
    }
}

我想您不能将数据修改为只包含一种格式?这比围绕这个问题工作要好。或者首先不要将日期/时间值存储为字符串。。。我对Pig了解不够,不知道这是否是一个合理的建议……我们不能更改数据,因为我们不负责创建数据,而且已经有大量数据使用这种不幸的格式:嗯。我认为这可以通过使用DateTimeFormatterBuilder构建的格式化程序来完成。我们将进行试验。