使用猪的所有组合

时间:2015-01-24 20:50:46

标签: hadoop apache-pig

我正处于学习猪/猪拉丁语的一些非常早期的阶段,所以原谅缺乏知识。如果我们的数据集格式如下:

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可能并不完美,但我希望能够理解这一点,但是对于实现这一点的任何帮助都会受到赞赏。

2 个答案:

答案 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可能会给我提供我需要的组合,然后减去两列。