在pig中获得avg

izkcnapc  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(372)

我需要得到每个性别组的平均年龄。。。
这是我的数据集:

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编程,所以请原谅我,如果解决方案是非常明显的。
进一步分析,它似乎有麻烦的平均计算,我认为我犯了一个错误,在数据类型,但年龄是整数。
如果你能帮我,谢谢。

c9x0cxw0

c9x0cxw01#

我发现了这个问题。请参阅如何在apache pig上强制执行正确的数据类型?为了更好的解释。
但是,为了展示我所做的。。。我必须把我的数据

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

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

相关问题