2017-08-28 13 views
0

Je suis très nouveau à Pig, donc face à certains problèmes tout en essayant d'effectuer un traitement très basique dans le porc.traitement de données dans le porc, avec onglet séparé

1- Charger ce fichier à l'aide de porc

2- Ecrire une logique de traitement pour filtrer les enregistrements en fonction de la date, par exemple, les lignes ont 2 colonnes Col_1 et col_2 (en supposant que les colonnes sont chararray) et je dois obtenir seuls les enregistrements ayant un jour de différence entre col_1 et col_2.

3- Enfin, stockez cet enregistrement filtré dans la table Hive.

fichier d'entrée (onglet séparé): -

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 

Lorsque je tente

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

Le résultat que je reçois comme ci-dessous: - A DUMP;

(,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) 

Vous ne savez pas pourquoi? S'il vous plaît quelqu'un peut-il m'aider dans cette façon d'analyser les fichiers séparés par des onglets et comment cacher ce chararray à Date et filtrer en fonction de la différence de jour?

Merci

+0

Vous avez probablement de l'espace dans la partie schéma de l'instruction de chargement. –

+0

Merci, j'ai résolu le problème. En fait, il y avait un champ de plus au début et que j'ai défini comme int, changé en long et cela a fonctionné. –

Répondre

1

Convertir les colonnes à l'objet datetime en utilisant ToDate et utiliser DaysBetween .Ce devrait donner la différence et si la différence == 1 puis chargez filter.Finally il ruche.

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

Merci beaucoup pour votre aide, cela a fonctionné. –

+0

Juste curieux de savoir pouvez-vous m'aider avec du code, si col_1 et col_2 sont dans unix_time_stamp? La même fonction ne fonctionne pas? de l'aide ? –

+0

Cela devrait fonctionner, il suffit d'utiliser ToDate (col_1) sans aucune chaîne de format. –