2015-01-06 2 views
1

У меня есть два набора данных,Найти средний путем объединения двух наборов данных

EmployeeDetail(data set 1):- 
    id 
    name 
    gender 
    location 

SalaryDetail(data set 2):- 
    id 
    salary 

мне нужно присоединиться как и выяснить, среднюю зарплату мужчин и женщин в каждом месте. Поэтому я попробовал следующий код.

EmpDetail = load '/Users/bmohanty6/EmployeeDetails/EmpDetail.txt' as 
(id:int, name:chararray, gender:chararray, location:chararray); 
SalaryDetail = load '/Users/bmohanty6/EmployeeDetails/EmpSalary.txt' as 
(id:int, salary:float);          
JoinedEmpDetail = join EmpDetail by id, SalaryDetail by 
id;                   
GroupedByLocation = group JoinedEmpDetail by location; 
AverageSalary = foreach GroupedByLocation { 
genderGrp = group JoinedEmpDetail by JoinedEmpDetail.EmpDetail::gender; 
avgSalary = foreach genderGrp generate group, 
AVG(JoinedEmpDetail.SalaryDetail::salary); 
generate group as location, JoinedEmpDetail.EmpDetail::gender, avgSalary; 
}; 

Но это бросает ниже ошибки

<line 6, column 22> Syntax error, unexpected symbol at or near 
'JoinedEmpDetail' 

Может кто-нибудь, пожалуйста, помогите, где я делаю ошибку, или как сделать это правильно?

Для большей ясности о моем требовании я даю несколько наборов данных образцов.

EmpDetail.txt

1 Biswa Male Bangalore 
12 Bratati Mahapatra Female Chennai 
2 Bibhu kalyan Male Bangalore 
3 Chinta Male Mumbai 
10 Amrit Anand Male Bangalore 
11 Sateesh panda Male Bangalore 
4 Kirti Kumar Male Mumbai 
6 Shruthi Female Chennai 
7 Vijay Male Chennai 
5 Bibhu Male Chennai 
9 Bratati Mohanty Female Bangalore 
8 Rupa Mahapatra Female Bangalore 
13 Salini Female Mumbai 
14 Priyanka Chopra Female Mumbai 

EmpSalary.txt

1 10000 
12 12000 
2 15900 
3 9000 
10 8000 
11 13400 
4 7600 
6 22000 
7 17000 
5 16800 
9 9800 
8 10000 
13 11000 
14 12500 

Окончательный результат мне нужно:

Mumbai male <avgsalary amount> 
Mumbai female <avgsalary amount> 
Bangalore male <avgsalary amount> 
Bangalore female <avgsalary amount> 
Chennai male <avgsalary amount> 
Chennai female <avgsalary amount> 

ответ

1

Вы можете решить эту проблему, используя простые foreach stmt, так что не отправляйте вложенные foreach stmt.

Group command не будет работать внутри гнезда Foreach, его ограничено в свинье. Внутри встроенного foreach допускается только несколько команд (CROSS, DISTINCT, FILTER, FOREACH, LIMIT и ORDER BY).

Вы можете изменить ваш скрипт.

EmpDetail = load '/Users/bmohanty6/EmployeeDetails/EmpDetail.txt' as (id:int, name:chararray, gender:chararray, location:chararray); 
SalaryDetail = load '/Users/bmohanty6/EmployeeDetails/EmpSalary.txt' as (id:int, salary:float);          
JoinedEmpDetail = join EmpDetail by id, SalaryDetail by id; 
GroupedByLocation = group JoinedEmpDetail by (location,gender); 
AverageSalary = FOREACH GroupedByLocation GENERATE FLATTEN(group),AVG(JoinedEmpDetail.SalaryDetail::salary); 
DUMP AverageSalary; 

Выход:

(Mumbai,Male,8300.0) 
(Mumbai,Female,11750.0) 
(Chennai,Male,16900.0) 
(Chennai,Female,17000.0) 
(Bangalore,Male,11825.0) 
(Bangalore,Female,9900.0) 
+0

Он работал отлично. Большое спасибо за разъяснение моей ошибки. – Biswa

Смежные вопросы