Join 根据Pig中的字符串匹配条件连接两个数据集

Join 根据Pig中的字符串匹配条件连接两个数据集,join,apache-pig,Join,Apache Pig,我是猪的新手,我有两个数据集,“高消费者”和“反馈” 挥金如土者: Price,fname,lname $50,Jack,Brown $30,Rovin,Pall 反馈: date,Name,rate 2015-01-02,Jack B Brown,5 2015-01-02,Pall,4 现在,我必须根据这两个数据集的名称来连接它们。我的情况应该是高消费者的fname或lname应该与反馈的名称匹配。如何连接这两个数据集?有什么想法吗?您可以尝试在下面的脚本中执行相同的操作,您所需要的只是根

我是猪的新手,我有两个数据集,“高消费者”和“反馈”

挥金如土者:

Price,fname,lname
$50,Jack,Brown
$30,Rovin,Pall
反馈:

date,Name,rate
2015-01-02,Jack B Brown,5
2015-01-02,Pall,4

现在,我必须根据这两个数据集的名称来连接它们。我的情况应该是高消费者的
fname
lname
应该与反馈的名称匹配。如何连接这两个数据集?有什么想法吗?

您可以尝试在下面的脚本中执行相同的操作,您所需要的只是根据您的数据替换名称

highs = LOAD 'highs' using PigStorage(',') as (Price:chararray,fname:chararray,lname:chararray);
feedback = LOAD 'feeds' using PigStorage(',') as (date:chararray,Name:chararray,rate:chararray);
out = JOIN highs BY fname, feedback BY Name;
out1 = JOIN highs BY lname, feedback BY Name;
final_out = UNION out,out1;
如需进一步帮助,请参阅此

编辑

根据字符串函数连接数据的注释脚本如下:

highs = LOAD 'highs' using PigStorage(',') as (Price:chararray,fname:chararray,lname:chararray);
feedback = LOAD 'feeds' using PigStorage(',') as (date:chararray,Name:chararray,rate:chararray);
crossout = cross highs, feedback;
final_lname = filter crossout by ( REPLACE (feedback::Name,highs::lname ,'') != feedback::Name);
final_fname = filter crossout by ( REPLACE (feedback::Name,highs::fname ,'') != feedback::Name);
final = UNION final_lname, final_fname;

您可以尝试在下面的脚本中执行相同的操作,您所需要的只是根据您的数据替换名称

highs = LOAD 'highs' using PigStorage(',') as (Price:chararray,fname:chararray,lname:chararray);
feedback = LOAD 'feeds' using PigStorage(',') as (date:chararray,Name:chararray,rate:chararray);
out = JOIN highs BY fname, feedback BY Name;
out1 = JOIN highs BY lname, feedback BY Name;
final_out = UNION out,out1;
如需进一步帮助,请参阅此

编辑

根据字符串函数连接数据的注释脚本如下:

highs = LOAD 'highs' using PigStorage(',') as (Price:chararray,fname:chararray,lname:chararray);
feedback = LOAD 'feeds' using PigStorage(',') as (date:chararray,Name:chararray,rate:chararray);
crossout = cross highs, feedback;
final_lname = filter crossout by ( REPLACE (feedback::Name,highs::lname ,'') != feedback::Name);
final_fname = filter crossout by ( REPLACE (feedback::Name,highs::fname ,'') != feedback::Name);
final = UNION final_lname, final_fname;

嗨,维卡斯,我也是这么做的,但当我把期末考试的成绩甩出去的时候,我一点也不差results@RinkuBuragohain您需要根据数据位置更改文件位置和文件名。在每一步之后调试更多转储数据。Vikas我的疑问是你怎么能以他们的名字加入他们,因为high的名字像Jack,feedback的名字像Jack B Brown,我认为我们必须进行某种字符串匹配。@RinkuBuragohain我们可以通过像Indexof这样的任何字符串函数来实现这一点,但结果将不准确,因为同一行将有两行。。“杰克B布朗”首先是杰克,然后是布朗。好吗?嗨,Vikas,我想这样行,让我也试试。谢谢manHi,Vikas,我也是这么做的,但当我把期末考试结果出来的时候,我什么都没有了results@RinkuBuragohain您需要根据数据位置更改文件位置和文件名。在每一步之后调试更多转储数据。Vikas我的疑问是你怎么能以他们的名字加入他们,因为high的名字像Jack,feedback的名字像Jack B Brown,我认为我们必须进行某种字符串匹配。@RinkuBuragohain我们可以通过像Indexof这样的任何字符串函数来实现这一点,但结果将不准确,因为同一行将有两行。。“杰克B布朗”首先是杰克,然后是布朗。好吗?嗨,Vikas,我想这样行,让我也试试。谢谢