我需要得到每个性别群体的平均年龄......
这是我的数据集:
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。
如果你能帮助我,谢谢你。
答案 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。