2016-07-01 10 views
2

Ich habe eine Eingabe als CSV-Datei, die ich versuche, mit Pig zu verarbeiten. In der CSV gibt es eine Datumsspalte, die für einige Zeilen beschädigte Werte enthält. Bitte schlagen Sie mir einen Mechanismus vor, um die beschädigten Zeilen herauszufiltern (habe eine beschädigte Datumsspalte), bevor ich die Funktion ToDate() auf die Datumsspalte in einer FOREACH...GENERATE-Anweisung anwende.Ausnahme in ToDate in Pig für einzelne Zeilen vermeiden

A Abtastformat meiner Daten ist:

A, 21,12/1/2010 8:26
B, 33,12/1/2010 8:26
C, 42, ich bin
D beschädigt, 30,12/1/2013 9:26

ich möchte dies laden zu können und dann verwandelt dies als:

csv-Datei Unter der Annahme, in Y geladen (Name ,Ich würde Bisher)

X = FOREACH Y GENERATE ToDate(date, 'mm/dd/yyyy HH:mm') AS newdate; 

ich eine FILTER-Y vor der obigen Aussage anwenden möchten Zeile, um herauszufiltern mit C beginnend Da, wie ist, die obige Aussage Ausnahme auslöst und der Auftrag nicht, wenn ich DUMP X;.

+0

Die offensichtlichste und geradlinigste, die ich mir vorstellen kann, ist nach der Länge des Feldes zu filtern. Abgesehen davon können Sie eine UDF schreiben, um Ausnahmen abzufangen. – madbitloman

Antwort

1

Zwei Fälle, wenn ToDate ausfällt,

1) Wenn das Datum fehlt oder Syntax ist falsch, Filter alle Termine einen regulären Ausdruck,

X = FILTER Y BY (date matches '/(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/'); 

2) Wenn das angegebene Datum fällt DST (https://en.wikipedia.org/wiki/Daylight_saving_time) Ihrer Zeitzone. Sie müssen das manuell filtern.