2015-01-24 5 views
1

Я нахожусь на очень ранних этапах обучения Pig/Pig Latin, поэтому прощайте недостаток знаний. Если бы мы имели набор данных, который был в формате что-то вроде:все комбинации с использованием свиньи

Fname, LNAME, месяц, платить, emp_category

Боб Смит, январь, 2000, не менеджер

Боб Смит, Февраль, 2000, не менеджер

Джон Доу, январь, 4500, менеджер

Джон Доу, февраль, 4500, менеджер

Я вижу, как бы я т Если бы я хотел создать набор данных, который также вычитал бы общую зарплату каждого сотрудника из общей заработной платы каждого сотрудника:

Bob, Smith 4000, не-менеджер, Джон Доу, 9000, менеджер, 5000

с SQL я бы, вероятно, просто создать две временные таблицы с:

ВЫБОР Fname, LName, сумма (зарплаты) как total_pay_m WHERE категория = 'менеджер' INTO M_table FROM table_name;

ВЫБОР Fname, LNAME, сумма (оплата), как total_pay_nm Где категория = 'non_manager' НА NM_table FROM 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 будет оценена по достоинству.

ответ

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 

Pig:

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) 
+0

Очень приятно! В итоге у меня получилось нечто похожее. Я должен был немного сгладить, но вы не знали бы этого, основываясь на том, как я задал вопрос. – user1624577

0

Я думаю, что использование CROSS может дать мне то, что мне нужно, чтобы получить нужные мне комбинации, а затем вычесть два столбца.

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