2017-06-04 13 views
0

je Les données suivantes:Coulée en charge par rapport à l'étape séparée

John,fl,3 
John,wt,3 
John,sp,4 
John,sm,3 
Mary,fl,3 
Mary,wt,3 
Mary,sp,4 
Mary,sm,4 

Je veux calculer la moyenne gpa (3e colonne) dans les données par nom (première colonne). Pour cela, j'ai créé le script de cochon suivant et cela fonctionne très bien.

a = LOAD '/root/sample.txt' using PigStorage(',') as (name:chararray, other:chararray, gpa:int); 
b = group a by name; 
c = foreach b generate group, AVG(a.gpa); 

Ensuite, je réécris le même script que ci-dessous. Cette fois coulée colonnes dans une étape séparée plutôt que la charge, mais sous le code me donne jetai erreur d'exception:

java.lang.Exception: java.lang.ClassCastException: org.apache.pig.data.DataByteArray cannot be cast to java.lang.String 
    at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462) 

a = LOAD '/root/sample.txt' using PigStorage(','); 
b = foreach a generate $0 as name:chararray, $1 as other:chararray, $2 as gpa:int; 
c = group b by name; 
d = foreach c generate group, AVG(b.gpa); 

Je ne peux pas comprendre pourquoi ??? comment sont les deux échantillons de code différents?

+0

Vous avez probablement une valeur nulle dans l'un des enregistrements causant l'erreur de conversion. Essayez de vider les données et de DÉCRIRE a; après l'instruction de chargement. –

Répondre

0

Cela ressemble à un bug qui pourrait être corrigé à partir de la version - 0.17.

Ref: Run a String through Java using Pig et https://issues.apache.org/jira/browse/PIG-2315 pour plus de détails. Pour l'instant, pour que la deuxième approche fonctionne, une conversion de type explicite est requise.

b = foreach a generate (chararray)$0 as name:chararray, (chararray)$1 as other:chararray, (int)$2 as gpa:int;