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

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

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

  1. 101|PORAWAT
  2. 102|HADI
  3. 103|RIO

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

  1. 1001|case1|PORACWAT VS RIO CORP
  2. 1002|case2|PANIT

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

  1. REGISTER hdfs:/user/hue/myudfs.jar;
  2. -- LOAD
  3. person_list = LOAD '/user/hue/data/person' USING PigStorage('|') as (p_id:chararray,p_name:chararray);
  4. content_list = LOAD '/user/hue/data/content' USING PigStorage('|') as (c_id:chararray,c_caseid:chararray,c_content:chararray);
  5. -- CROSS
  6. person_cross_content = CROSS person_list, content_list;
  7. DESCRIBE person_cross_content;
  8. 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}

因此,交叉内容将是:

  1. 101,PORAWAT,1001,case1,PORACWAT X RIO CORP
  2. 101,PORAWAT,1002,case2,PANIT
  3. 102,HADI,1001,case1,PORACWAT X RIO CORP
  4. 102,HADI,1002,case2,PANIT
  5. 103,RIO,1001,case1,PORACWAT X RIO CORP
  6. 103,RIO,1002,case2,PANIT

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

  1. -- MyFuzzyMatching will return true when p_name occurred(exact/similar) in c_content
  2. A = FOREACH person_cross_content GENERATE p_name, c_caseid, myudfs.MyFuzzyMatching(p_name,c_content) as (fuzzy_result:chararray);
  3. -- Filter just only match result
  4. FILTER A BY fuzzy_result == 'true';
  5. -- Store the result ...

因此,输出如下:

  1. PORAWAT,case1,true
  2. RIO,case1,true

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

z9zf31ra

z9zf31ra1#

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

相关问题