5

我有一个涉及 2 个 Pig 关系的 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 输出到文件的输出,而我宁愿直接使用包和元组(是否有内置的 Pig java 函数来将字符串解析回 Bag /元组形式?)。

有谁知道应该怎么做?

4

1 回答 1

1

这是一个适合你的技巧。

您首先在 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);

由于这是复制连接,它也只是地图侧连接。

于 2013-03-15T06:15:15.683 回答