所有使用猪的组合

all combinations using pig

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

fname, lname, month, pay, emp_category

Bob, Smith,2000 年 1 月,非经理

Bob, Smith,2000 年 2 月,非经理

John, Doe, January, 4500, 经理

John,Doe,二月,4500,经理

我知道如何计算每个员工的总工资,如果我想创建一个数据集,该数据集还从每个员工的总工资中减去每个员工的总工资:

Bob,Smith 4000,非经理,John Doe,9000,经理,5000

使用 SQL 我可能会创建两个临时表:

SELECT fname, lname, sum(pay) as total_pay_m 其中类别 = 'manager' 进入 M_table 从 TABLE_NAME;

SELECT fname, lname, sum(pay) as total_pay_nm 其中类别 = 'non_manager' 进入 NM_table 从 TABLE_NAME;

SELECT *, ABS(total_pay_nm - total_pay_m) 作为 PayDiff 从 M_table, NM_table 其中 M_table.fname <> NM_table.fname 和 M_table.lname <> NM_table.lname;

SQL 可能并不完美,但我希望大家理解这一点,但如果您能协助 Pig 实现这一目标,我们将不胜感激。

我认为使用 CROSS 可能会为我提供所需的组合,然后减去两列。

有趣的运动!

输入:

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)