2017-08-28 2 views
0

Ich bin sehr neu zu Pig, so dass einige Probleme beim Versuch, sehr grundlegende Verarbeitung in Pig durchzuführen.Datenverarbeitung in Schwein, mit Registerkarte getrennt

1- laden, die Schwein-Datei mit

2- eine Verarbeitungslogik schreiben Datensätze zu filtern, basierend auf Datum, zum Beispiel der Linien 2 Spalten col_1 und col_2 (nehmen die Spalten chararray) und ich brauche zu bekommen nur die Datensätze, die einen Tag Unterschied zwischen col_1 und col_2 haben.

3- Speichern Sie schließlich diesen gefilterten Datensatz in der Hive-Tabelle.

Eingabedatei (Tabulator getrennt): -

2016-01-01T16:31:40.000+01:00 2016-01-02T16:31:40.000+01:00 
2017-01-01T16:31:40.000+01:00 2017-01-02T16:31:40.000+01:00 

Wenn ich versuche,

A = LOAD '/user/inp.txt' USING PigStorage('\t') as (col_1:chararray,col_2:chararray); 

Das Ergebnis, das ich wie unten bin immer: - DUMP A;

(,2016-01-03T19:28:58.000+01:00,2016-01-02T16:31:40.000+01:00) 
(,2017-01-03T19:28:58.000+01:00,2017-01-02T16:31:40.000+01:00) 

Nicht sicher Warum? Kann mir bitte jemand helfen, wie man Tab-separierte Dateien parst und wie man diesen Chararray zu Date umwandelt und basierend auf Day Difference filtert?

Dank

+0

Wahrscheinlich haben Sie Platz im Schema Teil der Load-Anweisung. –

+0

Danke, ich habe das Problem gelöst. eigentlich gab es am anfang noch ein feld und das definierte ich als int, änderte es zu lang und es funktionierte. –

Antwort

1

Konvertieren Sie die Spalten in Datetime-Objekt ToDate mit und DaysBetween .Dieses verwenden sollte den Unterschied und wenn die Differenz == 1 dann filter.Finally laden Sie es hive geben.

A = LOAD '/user/inp.txt' USING PigStorage('\t') as (col_1:chararray,col_2:chararray); 
B = FOREACH A GENERATE DaysBetween(ToDate(col_1,'yyyy-MM-dd HH:mm:ss'),ToDate(col_2,'yyyy-MM-dd HH:mm:ss')) as day_diff; 
C = FILTER B BY (day_diff == 1); 
STORE C INTO 'your_hive_partition' USING org.apache.hive.hcatalog.pig.HCatStorer(); 
+0

Vielen Dank für Ihre Hilfe, es hat funktioniert. –

+0

Nur neugierig zu wissen, können Sie mir mit Code helfen, wenn col_1 und col_2 in unix_time_stamp sind? Die gleiche Funktion funktioniert nicht? irgendeine Hilfe ? –

+0

Es sollte funktionieren, verwenden Sie einfach ToDate (Col_1) ohne Format Zeichenfolge. –