让AVG进入猪

时间:2016-10-31 20:45:40

标签: hadoop apache-pig

我需要得到每个性别群体的平均年龄......

这是我的数据集:

01::F::21::0001
02::M::31::21345
03::F::22::33323
04::F::18::123
05::M::31::14567

基本上这是

userid::gender::age::occupationid

由于有多个分隔符,我在stackoverflow中的某处读取,首先通过TextLoader()

加载它
loadUsers  = LOAD '/user/cloudera/test/input/users.dat' USING TextLoader() as (line:chararray); 

testusers = FOREACH loadusers GENERATE FLATTEN(STRSPLIT(line,'::')) as (user:int,  gender:chararray,  age:int, occupation:int);

grunt> DESCRIBE testusers;
testusers: {user: int,gender: chararray,age: int,occupation: int}

grouped_testusers = GROUP testusers BY gender;
average_age_of_testusers = FOREACH grouped_testusers GENERATE group, AVG(testusers.age);

运行后

dump average_age_of_testusers

这是hdfs中的错误

2016-10-31 13:39:22,175 [main] ERROR org.apache.pig.tools.pigstats.SimplePigStats - 
ERROR 0: Exception while executing (Name: grouped_testusers: Local Rearrange[tuple]{chararray}(false) - scope-284 Operator Key: scope-284): org.apache.pig.backend.executionengine.ExecException: 
ERROR 2106: Error while computing average in Initial 2016-10-31 13:39:22,175 [main] 

ERROR org.apache.pig.tools.pigstats.PigStatsUtil - 1 map reduce job(s) failed!

Input(s):
Failed to read data from "/user/cloudera/test/input/users.dat"

Output(s):
Failed to produce result in "hdfs://quickstart.cloudera:8020/tmp/temp-169204712/tmp-1755697117"

这是我在猪编程中的第一次尝试,如果解决方案非常明显,请原谅我。

进一步分析,它似乎无法计算平均值,我认为我在数据类型中犯了一个错误,但是年龄是int。

如果你能帮助我,谢谢你。

1 个答案:

答案 0 :(得分:1)

我想出了这个问题。有关更好的解释,请参阅How can correct data types on Apache Pig be enforced?

但是,然后,只是为了表明我做了什么......我必须投出我的数据

FOREACH loadusers GENERATE FLATTEN((tuple(int,chararray,int,int))  STRSPLIT(line,'::')) as (user:int,      gender:chararray,  age:int, occupation:int);

AVG失败,因为loadusers.age被视为字符串而不是int。