我需要得到每个性别组的平均年龄。。。
这是我的数据集:
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"
这是我第一次尝试在Pig编程,所以请原谅我,如果解决方案是非常明显的。
进一步分析,它似乎有麻烦的平均计算,我认为我犯了一个错误,在数据类型,但年龄是整数。
如果你能帮我,谢谢。
1条答案
按热度按时间c9x0cxw01#
我发现了这个问题。请参阅如何在apache pig上强制执行正确的数据类型?为了更好的解释。
但是,为了展示我所做的。。。我必须把我的数据
avg失败,因为loadusers.age被视为字符串而不是int。