我想使用我创建的模糊UDF,将每个人列表与所有内容数据进行比较,方法是将它们发送到UDF。为了做到这一点,我决定在发送之前使用 CROSS 数据。
这是我的样本人名单,
101|PORAWAT
102|HADI
103|RIO
我的内容每个数据可能包含多个人和数据可能相似(由于拼写错误):
1001|case1|PORACWAT VS RIO CORP
1002|case2|PANIT
要将数据发送到UDF,我决定在调用UDF之前使用CROSS数据,这是我的代码:
REGISTER hdfs:/user/hue/myudfs.jar;
-- LOAD
person_list = LOAD '/user/hue/data/person' USING PigStorage('|') as (p_id:chararray,p_name:chararray);
content_list = LOAD '/user/hue/data/content' USING PigStorage('|') as (c_id:chararray,c_caseid:chararray,c_content:chararray);
-- CROSS
person_cross_content = CROSS person_list, content_list;
DESCRIBE person_cross_content;
person_cross_content : {person_list::p_id: chararray,person_list::p_name: chararray,content_list::c_id: chararray,content_list::c_caseid: chararray,content_list::c_content: chararray}
因此,交叉内容将是:
101,PORAWAT,1001,case1,PORACWAT X RIO CORP
101,PORAWAT,1002,case2,PANIT
102,HADI,1001,case1,PORACWAT X RIO CORP
102,HADI,1002,case2,PANIT
103,RIO,1001,case1,PORACWAT X RIO CORP
103,RIO,1002,case2,PANIT
然后,使用我的模糊UDF检查所有内容的所有人,只获得完全/相似的匹配结果,我会称之为:
-- MyFuzzyMatching will return true when p_name occurred(exact/similar) in c_content
A = FOREACH person_cross_content GENERATE p_name, c_caseid, myudfs.MyFuzzyMatching(p_name,c_content) as (fuzzy_result:chararray);
-- Filter just only match result
FILTER A BY fuzzy_result == 'true';
-- Store the result ...
因此,输出如下:
PORAWAT,case1,true
RIO,case1,true
当我执行此脚本命令时,它使用很长时间来获取结果,当我使用真实数据时。关于Pig参考,由于操作昂贵,不建议使用CROSS,但我不知道如何实现这些。
有没有更好的方法将所有内容发送给UDF?
答案 0 :(得分:0)
如果您的数据量很大,CROSS可能会导致性能问题(think you know this already)。一种选择是将UDF分离和交叉关系所需的字段(p_name,c_content)投影出去。由于数据较少,CROSS可能会略快一些。运行UDF后,您可以将它们加入。