Pig Latin: de Charger plusieurs fichiers à partir d'une plage de dates (une partie de la structure de répertoire)
J'ai le scénario suivant-
Cochon version 0.70
Échantillon HDFS structure de répertoire:
/user/training/test/20100810/<data files>
/user/training/test/20100811/<data files>
/user/training/test/20100812/<data files>
/user/training/test/20100813/<data files>
/user/training/test/20100814/<data files>
Comme vous pouvez le voir dans les chemins d'accès indiqués ci-dessus, l'un des noms de répertoire est un timbre à date.
Problème: je veux charger des fichiers à partir d'une plage de dates-dire à partir de 20100810 à 20100813.
Je peux passer le " de " et " à " de la plage de dates que les paramètres pour le script Pig mais comment puis-je faire usage de ces paramètres dans l'instruction de CHARGEMENT. Je suis en mesure de faire ce qui suit
temp = LOAD '/user/training/test/{20100810,20100811,20100812}' USING SomeLoader() AS (...);
Les ouvrages suivants, avec hadoop:
hadoop fs -ls /user/training/test/{20100810..20100813}
Mais il échoue quand j'ai essayer la même chose avec la CHARGE à l'intérieur du script pig. Comment puis-je utiliser les paramètres passés au script Pig pour charger des données à partir d'une plage de dates?
Journal des erreurs suivantes:
Backend error message during job submission
-------------------------------------------
org.apache.pig.backend.executionengine.ExecException: ERROR 2118: Unable to create input splits for: hdfs://<ServerName>.com/user/training/test/{20100810..20100813}
at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigInputFormat.getSplits(PigInputFormat.java:269)
at org.apache.hadoop.mapred.JobClient.writeNewSplits(JobClient.java:858)
at org.apache.hadoop.mapred.JobClient.writeSplits(JobClient.java:875)
at org.apache.hadoop.mapred.JobClient.access$500(JobClient.java:170)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:793)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:752)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1062)
at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:752)
at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:726)
at org.apache.hadoop.mapred.jobcontrol.Job.submit(Job.java:378)
at org.apache.hadoop.mapred.jobcontrol.JobControl.startReadyJobs(JobControl.java:247)
at org.apache.hadoop.mapred.jobcontrol.JobControl.run(JobControl.java:279)
at java.lang.Thread.run(Thread.java:619)
Caused by: org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input Pattern hdfs://<ServerName>.com/user/training/test/{20100810..20100813} matches 0 files
at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:231)
at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigTextInputFormat.listStatus(PigTextInputFormat.java:36)
at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.getSplits(FileInputFormat.java:248)
at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigInputFormat.getSplits(PigInputFormat.java:258)
... 14 more
Pig Stack Trace
---------------
ERROR 2997: Unable to recreate exception from backend error: org.apache.pig.backend.executionengine.ExecException: ERROR 2118: Unable to create input splits for: hdfs://<ServerName>.com/user/training/test/{20100810..20100813}
org.apache.pig.impl.logicalLayer.FrontendException: ERROR 1066: Unable to open iterator for alias test
at org.apache.pig.PigServer.openIterator(PigServer.java:521)
at org.apache.pig.tools.grunt.GruntParser.processDump(GruntParser.java:544)
at org.apache.pig.tools.pigscript.parser.PigScriptParser.parse(PigScriptParser.java:241)
at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:162)
at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:138)
at org.apache.pig.tools.grunt.Grunt.run(Grunt.java:75)
at org.apache.pig.Main.main(Main.java:357)
Caused by: org.apache.pig.backend.executionengine.ExecException: ERROR 2997: Unable to recreate exception from backend error: org.apache.pig.backend.executionengine.ExecException: ERROR 2118: Unable to create input splits for: hdfs://<ServerName>.com/user/training/test/{20100810..20100813}
at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.Launcher.getStats(Launcher.java:169)
Ai-je besoin de faire usage d'une hausse des langages comme le Python pour capturer tous les cachets de date dans la gamme et de les transmettre à CHARGER comme une liste séparée par des virgules?
acclamations
- Pour les personnes qui ont trouvé ce post lors de la recherche de ERREUR 1066: Impossible d'ouvrir itérateur pour alias voici un solution générique.
Vous devez vous connecter pour publier un commentaire.
Cochon est le traitement de votre modèle de nom de fichier à l'aide de l'hadoop fichier glob utilitaires, pas que le shell de glob utilitaires. Hadoop sont documentés ici. Comme vous pouvez le voir, hadoop ne prend pas en charge le '..' opérateur pour une gamme. Il me semble que vous avez deux options - soit écrire le
{date1,date2,date2,...,dateN}
liste à la main, qui, si c'est un rare cas d'utilisation est probablement la voie à suivre, ou d'écrire un script qui génère cette liste pour vous. La construction d'une telle liste à partir d'une plage de date devrait être une tâche facile pour le langage de script de votre choix. Pour mon application, je suis allé avec la liste générée route, et ça fonctionne très bien (CHD3 de distribution).Comme zjffdu dit, le chemin de l'expansion est effectuée par le shell. Une façon courante pour résoudre votre problème est tout simplement de l'utilisation de Porc paramètres (ce qui est un bon moyen pour faire de votre script plus réutilisable de toute façon):
shell:
script.cochon:
pig -f script.pig -param input=/user/training/test/20100810 input=/user/training/test/20100811 input=/user/training/test/20100812
(modifier lapig
àecho
si vous voulez le voir). Seule la premièreinput=
est précédée par-param
; le reste ne sont pas de porc paramètres de liaisons à tous. Mais le cochon s'arrête tout simplement le traitement des arguments de ligne de commande lors de la première méconnuinput=...
et s'exécute uniquement la première date!input=...
à l'aide d'un script pig avec un deuxième paramètre (direoutput
), et de mettre le-param output=...
après l'entrée de la liaison. Vous obtenez un message d'erreur à propos deUndefined parameter : output
.j'ai couru à travers cette réponse, lorsque j'ai eu du mal à essayer de créer un fichier glob dans un script et de le passer en paramètre à un script pig.
aucun des actuels réponses applique à ma situation, mais je n'ai trouver qu'une réponse générale qui pourrait être utile ici.
dans mon cas, la coquille d'expansion qui se passait et puis en passant que dans le script causant complète des problèmes avec le cochon de l'analyseur, ce qui est compréhensible.
donc simplement en entourant le glob entre double-quotes protège d'être élargi par le shell, et les transmet comme c'est dans la commande.
NE FONCTIONNE PAS:
TRAVAILLERA
j'espère que cela sauve quelqu'un de la douleur et d'agonie.
Donc, puisque cela fonctionne:
mais cela ne fonctionne pas:
mais si vous voulez une date de plage qui s'étend sur près de 300 jours, et en passant une liste complète de CHARGE n'est pas très élégant pour dire le moins. Je suis venu avec et ça marche.
Dites que vous voulez charger les données à partir de 2012-10-08 à aujourd'hui 2013-02-14, ce que vous pouvez faire est de
puis faire un filtre après que
si la variable est dans le milieu de chemin d'accès au fichier, concate nom du sous-dossier ou utiliser " * " pour tous les fichiers.
J'ai trouvé ce problème est causé par le shell linux. Shell Linux va vous aider à élargir
à
puis d'exécuter la commande
Mais dans le
hdfs api
, il ne vous aide pas à développer l'expression.Merci à dave campbell.
Certains de la réponse au-delà sont mauvais car ils ont eu des votes.
Qui suit est le résultat de mon test:
Œuvres
pig -f test.pig -param input="/test_{20120713,20120714}.txt"
pig -f test.pig -param input="/test_201207*.txt"
pig -f test.pig -param input="/test_2012071?.txt"
pig -f test.pig -param input="/test_20120713.txt,/test_20120714.txt"
pig -f test.pig -param input=/test_20120713.txt,/test_20120714.txt
Ne fonctionne pas
pig -f test.pig -param input="/test_{20120713..20120714}.txt"
pig -f test.pig -param input=/test_{20120713,20120714}.txt
pig -f test.pig -param input=/test_{20120713..20120714}.txt
Probablement pas - ce qui peut être fait à l'aide personnalisée Charge de l'UDF, ou d'essayer de repenser à l'annuaire de la structure (ce sera du bon travail, si votre plages sont quasi-statique).
en outre: Cochon accepte des paramètres, peut-être cela peut vous aider (peut-être que vous pourriez faire en fonction de charger des données à partir d'un jour et de l'union de jeu, mais je ne sais pas si c'est possible)
edit: probablement l'écriture simple en python ou en script bash qui génère une liste de dates (dossiers) est la solution la plus simple, que vous avez juste à passer pour de Porc, et cela devrait fonctionner correctement
À Romain réponse, si vous voulez juste paramétrer la date, le shell va courir comme ceci:
cochon:
Veuillez noter les guillemets.
Pig
soutien globe statut dehdfs
,donc je pense que
pig
peut gérer le motif/user/training/test/{20100810,20100811,20100812}
,pourrait vous coller les journaux d'erreur ?