use*_*326 6 java iso apache-pig
我希望将ISO时间格式转换为yyyy-mm-dd hh:mm:ss.SSS.但是我无法实现转换.我刚接触猪,我试图编写一个udf来处理从ISO格式到yyyy-mm-dd hh:mm:ss.SSS的转换.
请指导我,我尝试了猪的内置功能(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();
}
}
Run Code Online (Sandbox Code Playgroud)
我如何处理猪的日期转换?
使用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)
Run Code Online (Sandbox Code Playgroud)
我的猜测是它被转换了,但尚未进入主要文档.以下是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
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);
Run Code Online (Sandbox Code Playgroud)