我正处于学习猪/猪拉丁语的一些非常早期的阶段,所以原谅缺乏知识。如果我们的数据集格式如下:
fname,lname,month,pay,emp_category
Bob,Smith,2000年1月,非经理
Bob,Smith,2000年2月,非经理
John,Doe,1月,4500,经理
John,Doe,二月,4500,经理
我知道如何为每位员工付出代价,如果我想创建一个数据集,同时从每个员工的总工资中减去每个员工的总工资,那么该怎么做:
Bob,Smith 4000,非经理,John Doe,9000,经理,5000
使用SQL我可能只需创建两个临时表:
选择fname,lname,sum(pay)为total_pay_m 类别='经理' INTO M_table FROM TABLE_NAME;
选择fname,lname,sum(pay)为total_pay_nm 类别=' non_manager' INTO NM_table FROM TABLE_NAME;
SELECT *,ABS(total_pay_nm - total_pay_m)为PayDiff 来自M_table,NM_table WHERE M_table.fname<> NM_table.fname和 M_table.lname<> NM_table.lname;
SQL可能并不完美,但我希望能够理解这一点,但是对于实现这一点的任何帮助都会受到赞赏。
答案 0 :(得分:1)
有趣的运动!
输入:
Bob,Smith,January,2000,non-manager
Bob,Smith,February,2000,non-manager
John,Doe,January,4500,manager
John,Doe,February,4500,manager
Susan,Smith,January,4800,manager
Susan,Smith,February,4800,manager
猪:
A = load 'tmp.csv' using PigStorage(',') as (fname:chararray, lname:chararray, month:chararray, pay:int, emp_category:chararray);
split A into m if emp_category == 'manager', nm if emp_category == 'non-manager';
m_tmp = group m by (fname, lname);
m_pay = foreach m_tmp generate group.fname, group.lname, SUM(m.pay) as total_pay;
nm_tmp = group nm by (fname, lname);
nm_pay = foreach nm_tmp generate group.fname, group.lname, SUM(nm.pay) as total_pay;
C = cross m_pay, nm_pay;
R = foreach C generate *, nm_pay::total_pay - m_pay::total_pay;
dump R;
输出:
(John,Doe,9000,Bob,Smith,4000,-5000)
(Susan,Smith,9600,Bob,Smith,4000,-5600)
答案 1 :(得分:0)
我认为使用CROSS可能会给我提供我需要的组合,然后减去两列。