Apache Pig将整个关系加载到UDF中

时间:2012-12-08 11:05:16

标签: apache-pig

我有一个关于2个Pig关系的猪脚本,比如A和B.A是一个小关系,B是一个很大的关系。我的UDF应该在每台机器上将所有A加载到内存中,然后在处理B时使用它。目前我这样做。

A = foreach smallRelation Generate ...
B = foreach largeRelation Generate propertyOfB;
store A into 'templocation';
C = foreach B Generate CustomUdf(propertyOfB);

然后我从每个机器加载“templocation”来获得A.这是有效的,但我有两个问题。

  1. 我的理解是我应该以某种方式使用HDFS缓存,但我不确定如何将关系直接加载到HDFS缓存中。
  2. 当我在我的UDF中重新加载文件时,我必须编写逻辑来解析输出到文件的A的输出,当我宁愿直接使用包和元组时(是否有内置的猪java函数来解析字符串回到Bag / Tuple形式?)。
  3. 有谁知道应该怎么做?

1 个答案:

答案 0 :(得分:0)

这是一个适合你的技巧。

首先在A上进行GROUP ALL,将A中的所有数据“打包”到一个字段中。然后人为地在A和B上添加一个公共字段并加入它们。这样,在增强型B中的foreach元组中,您将拥有A的完整数据供您的UDF使用。

就是这样:

(最初在A中说,你有字段fa1,fa2,fa3,在B中你有fb1,fb2)

-- add an artificial join key with value 'xx'
B_aux = FOREACH B GENERATE 'xx' AS join_key, fb1, fb2;
A_all = GROUP A ALL;
A_aux = FOREACH A GENERATE 'xx' AS join_key, $1;
A_B_JOINED = JOIN B_aux BY join_key, A_aux BY join_key USING 'replicated';

C = FOREACH A_B_JOINED GENERATE CustomUdf(fb1, fb2, A_all);

因为这是复制连接,所以它也只是地图侧连接。