在pig中发送到udf之前获取交叉数据的更好方法

dauxcl2d  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(371)

我想使用我创建的模糊自定义项,将每个人列表与所有内容数据进行比较,然后将它们发送到自定义项。为了做到这一点,我决定使用交叉数据之前发送给它。
这是我的样本名单,

101|PORAWAT
102|HADI
103|RIO

而且我的内容(每个数据可能包含多个人)和数据可能相似(由于打字错误):

1001|case1|PORACWAT VS RIO CORP
1002|case2|PANIT

为了向自定义项发送数据,我决定在调用自定义项之前使用交叉数据,下面是我的代码:

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

然后,用我的模糊自定义项检查所有内容的所有人,只得到精确/相似的匹配结果,我会像这样调用:

-- 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

当我执行这个脚本命令时,当我使用真实数据时,需要很长时间才能得到结果。关于清管器参考,不建议使用cross,因为操作费用昂贵,但我不知道如何实现这些。
有没有更好的方法把所有的人和所有的内容发送到自定义项?

z9zf31ra

z9zf31ra1#

如果您的数据量过大,交叉可能会导致性能问题(认为您已经知道这一点)。一种方法是投影出udf所需的字段(p\u name,c\u content),以分离关系并交叉它们。在数据较少的情况下,cross可能会稍微快一点。你可以在运行完你的自定义项后加入他们。

相关问题