2014-07-17 1 views
0

J'ai un script de porc similaire à ce qui suit:PIG - concaténation d'une chaîne à un paramètre?

a = LOAD 'feedname.hourly_data' 
USING org.apache.hcatalog.pig.HCatLoader(); 
b = FILTER a BY dt=='$date{00}'; 
c = GROUP b ALL; 
d = FOREACH c GENERATE COUNT(b); 
dump d; 

Le script est exécuté avec les arguments suivants:

pig -useHCatalog -p date=20140708 my_script.pig 

Notez que ce script fonctionne avec la valeur dt hardcoded:

a = LOAD 'feedname.hourly_data' 
USING org.apache.hcatalog.pig.HCatLoader(); 
b = FILTER a BY dt=='2014070800'; 
c = GROUP b ALL; 
d = FOREACH c GENERATE COUNT(b); 
dump d; 

Toutefois, lorsque j'exécuterai après avoir passé le paramètre date=20140708, la requête retournera zéro résultat. Est-ce que quelqu'un sait pourquoi cela se passe? S'il n'y a pas assez d'information à dire, quelle est la première chose que je devrais tester?

Répondre

2

Vous pouvez use the -dryrun option pour voir à quoi ressemble votre script après la substitution des paramètres. Cela vous dira si vous filtrez comme prévu.

Il semble que Pig ne peut pas gérer un paramètre à l'intérieur d'une chaîne lorsqu'il n'est pas suivi d'un caractère illégal dans les noms de paramètres (comme /). Au lieu de cela, dans votre cas, vous devriez être en mesure d'utiliser CONCAT:

b = FILTER a BY dt==CONCAT('$date', '00'); 
+0

Merci, je ne savais pas que l'option dryrun ferait cela. En regardant la sortie de substitution, mon '' $ date {00} ''se développe en'' 20140708 {00} '', ce qui est faux. Faire 'b = FILTER a BY dt == $ {date} 00;' comme suggéré ne fonctionne pas, cependant - cochon se plaint de 'Erreur de syntaxe, symbole inattendu à ou près de '$'' J'ai aussi essayé 'b = FILTER a BY dt == '$ {date} 00'; ', mais il ne développe pas $ {date} 00'. – SheerSt

+0

Bummer. J'ai suggéré une alternative différente pour vous. –

+0

Merci pour la suggestion. J'ai essayé cela, et cela me donne une erreur de mémoire (ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2998: Erreur interne non gérée, limite de surcharge du GC dépassée) J'ai aussi essayé '% par défaut MIN_DATE \' echo $ {date} 00 \ ' % par défaut MAX_DATE \' echo $ {date} 23 \ '' sans succès (sorties d'écho respectivement '00' et' 23') – SheerSt