所有使用猪的组合
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)
我正处于学习 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)