Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 在发送到PIG中的UDF之前获取交叉数据的更好方法_Hadoop_Apache Pig_Fuzzy Comparison - Fatal编程技术网

Hadoop 在发送到PIG中的UDF之前获取交叉数据的更好方法

Hadoop 在发送到PIG中的UDF之前获取交叉数据的更好方法,hadoop,apache-pig,fuzzy-comparison,Hadoop,Apache Pig,Fuzzy Comparison,我想使用我创建的模糊UDF,通过将每个人列表与所有内容数据发送到UDF来进行比较。为了做到这一点,我决定在发送数据之前使用交叉数据。 这是我的样本名单 101|PORAWAT 102|HADI 103|RIO 而我的内容(每个数据可能包含多个人)和数据可能相似(由于打字错误): 为了向UDF发送数据,我决定在调用UDF之前使用交叉数据,下面是我的代码: REGISTER hdfs:/user/hue/myudfs.jar; -- LOAD person_list = LOAD '/user/

我想使用我创建的模糊UDF,通过将每个人列表与所有内容数据发送到UDF来进行比较。为了做到这一点,我决定在发送数据之前使用交叉数据。

这是我的样本名单

101|PORAWAT
102|HADI
103|RIO
而我的内容(每个数据可能包含多个人)和数据可能相似(由于打字错误):

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

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
当我执行这个脚本命令时,当我使用真实数据时,需要很长时间才能得到结果。关于清管器参考,不建议使用CROSS,因为操作费用昂贵,但我不知道如何实现这些目标


是否有更好的方法将包含所有内容的所有人员发送到UDF?

如果数据量过大,交叉可能会导致性能问题()。一种选择是投影出UDF分离关系和交叉关系所需的字段(p_名称、c_内容)。在数据较少的情况下,交叉可能会稍微快一点。运行UDF后,您可以加入他们

PORAWAT,case1,true
RIO,case1,true