2013-09-06 7 views
6

Iam che cerca di convertire il formato dell'ora ISO in aaaa-mm-gg hh: mm: ss.SSS. Tuttavia non sono in grado di ottenere la conversione. Sono nuovo per maiale e sto cercando di scrivere un udf per gestire la conversione dal formato ISO a aaaa-mm-gg hh: mm: ss.SSS.Pig UDF per iso a aaaa-mm-gg hh: mm: ss.000

Gentilmente mi guida Ho provato le funzioni di maiale (FORMAT, DATE_FORMAT) ma non è stato in grado di convertire i dati nel formato richiesto.

formato dati corrente: 2013-08-22T13: 23: 18,226,22 mila + 01: 00 formato

dati richiesto: 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(); 

    } 
} 

Come posso gestire le conversioni di date nel maiale?

+0

È un UDF necessario per svolgere questo compito? Sono attualmente di fronte a questo problema me stesso. Ho visto parlare di UDF di PiggyBank che potrebbero portare a termine questo, ma forse quelli non sono più necessari in 0.11? – Freerobots

risposta

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

2013-08-22T13: 23: 18,226,22 mila + 01: 00 è formato XSD dateTime e dovrebbe essere analizzato in questo modo

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

da XMLGregorianCalendar è possibile ottenere GregorianCalendar e poi java.util. Data

GregorianCalendar gc = xc.toGregorianCalendar 
Date date = gc.getTime(); 

Si noti che 226220 è il secondo frazionario. Se si tenta di analizzarlo con SimpleDateFormat come SSS lo analizzerà come 226220 millisecondi e sarà 226 secondi 220 ms invece di 0,2226220 sec

7

Con maiale 0.11.1, non è richiesta una UDF per la conversione dal formato ISO 8601 a aaaa-mm-gg hh: mm: ss.SSS formato. Di seguito è riportato un codice di esempio che mostra come convertire una colonna di date di formato ISO 8601 in aaaa-MM-gg HH: mm: ss.SSS date.

convert_date = FOREACH date_input GENERATE ToString (data, 'aaaa-MM-gg HH: mm: ss.SSS') come data: chararray;


NOTA:

Non credo che la funzione ToString è documentata ... ho indovinato a questo utilizzo da questa proposta Google SOC:

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

dove la seguente la funzione è menzionata come necessità di essere convertita da un UDF piggybank in un built-in.

String ToString(DateTime d, String format) 

La mia ipotesi è che è stato convertito, ma non è ancora entrato nella documentazione principale. Ecco la documentazione di classe per il ToString built-in:

http://pig.apache.org/docs/r0.11.1/api/org/apache/pig/builtin/ToString.html

Ma possiamo vedere che la funzione ToString non è presente la documentazione del maiale di apache qui:

http://pig.apache.org/docs/r0.11.1/func.html

+0

@ all Grazie mille – user2667326

+3

Vedere https://issues.apache.org/jira/browse/PIG-3349 per maggiori informazioni. In quel thread si nota che 'ToString (datetime, format_string)' non è documentato e commette la modifica del doc per la versione 0.12. – Steven

+0

Fantastico, grazie per aver chiarito questo mistero. – Freerobots