使用 PIG 连接后过滤数据
Posted
技术标签:
【中文标题】使用 PIG 连接后过滤数据【英文标题】:Filter data after join using PIG 【发布时间】:2017-04-25 13:29:31 【问题描述】:我想在两个文件合并后过滤记录。
文件 BX-Books.csv 包含书籍数据。并且文件 BX-Book-Ratings.csv 包含图书评级数据,其中 ISBN 是两个文件的公共列。文件之间的内部连接是使用此列完成的。 我想买 2002 年出版的书。
我使用了以下脚本,但我得到了 0 条记录。
grunt> BookXRecords = LOAD '/user/pradeep/BX-Books.csv' USING PigStorage(';') AS (ISBN:chararray,BookTitle:chararray,BookAuthor:chararray,YearOfPublication:chararray, Publisher:chararray,ImageURLS:chararray,ImageURLM:chararray,ImageURLL:chararray);
grunt> BookXRating = LOAD '/user/pradeep/BX-Book-Ratings.csv' USING PigStorage(';') AS (user:chararray,ISBN:chararray,rating:chararray);
grunt> BxJoin = JOIN BookXRecords BY ISBN, BookXRating BY ISBN;
grunt> BxJoin_Mod = FOREACH BxJoin GENERATE $0 AS ISBN, $1, $2, $3, $4;
grunt> FLTRBx2002 = FILTER BxJoin_Mod BY $3 == '2002';
【问题讨论】:
什么是“描述 BxJoin_Mod;”输出?您是否还有 YearOfPublication 为 2002 的数据? 咕噜声> DESCRIBE BxJoin_Mod; BxJoin_Mod: ISBN: chararray,BookXRecords::BookTitle: chararray,BookXRecords::BookAuthor: chararray,BookXRecords::YearOfPublication: chararr ay,BookXRecords::Publisher: chararray 是的,我有 YearOfPublication == 2002 的数据 请检查我发布的答案,我试过了,它确实有效。 你能告诉我这是否适合你吗? 【参考方案1】:我创建了一个 test.csv 和 test-rating.csv 以及一个可以使用它们的 Pig 脚本。它工作得很好。
test.csv
1;abc;author1;2002
2;xyz;author2;2003
test-rating.csv
user1;1;3
user2;2;5
猪脚本:
A = LOAD 'test.csv' USING PigStorage(';') AS (ISBN:chararray,BookTitle:chararray,BookAuthor:chararray,YearOfPublication:chararray);
describe A;
dump A;
B = LOAD 'test-rating.csv' USING PigStorage(';') AS (user:chararray,ISBN:chararray,rating:chararray);
describe B;
dump B;
C = JOIN A BY ISBN, B BY ISBN;
describe C;
dump C;
D = FOREACH C GENERATE $0 as ISBN,$1,$2,$3;
describe D;
dump D;
E = FILTER D BY $3 == '2002';
describe E;
dump E;
输出:
A: ISBN: chararray,BookTitle: chararray,BookAuthor: chararray,YearOfPublication: chararray
(1,abc,author1,2002)
(2,xyz,author2,2003)
B: user: chararray,ISBN: chararray,rating: chararray
(user1,1,3)
(user2,2,5)
C: A::ISBN: chararray,A::BookTitle: chararray,A::BookAuthor: chararray,A::YearOfPublication: chararray,B::user: chararray,B::ISBN: chararray,B::rating: chararray
(1,abc,author1,2002,user1,1,3)
(2,xyz,author2,2003,user2,2,5)
D: ISBN: chararray,A::BookTitle: chararray,A::BookAuthor: chararray,A::YearOfPublication: chararray
(1,abc,author1,2002)
(2,xyz,author2,2003)
E: ISBN: chararray,A::BookTitle: chararray,A::BookAuthor: chararray,A::YearOfPublication: chararray
(1,abc,author1,2002)
【讨论】:
【参考方案2】:要求:获取2002年出版的书籍。
不需要有2个数据集。 只有使用“BookXRecords”才能实现。
grunt>BookXRecords = LOAD '/user/pradeep/BX-Books.csv' USING PigStorage(';') AS (ISBN:chararray,BookTitle:chararray,BookAuthor:chararray,YearOfPublication:chararray, Publisher:chararray,ImageURLS:chararray,ImageURLM:chararray,ImageURLL:chararray);
grunt>A=FILTER BookXRecords BY year ='2002';
grunt>dump A;
【讨论】:
以上是关于使用 PIG 连接后过滤数据的主要内容,如果未能解决你的问题,请参考以下文章
pig 倾斜连接与大表导致“拆分元数据大小超过 10000000”