Apache Pig 将整个关系加载到 UDF

Posted

技术标签:

【中文标题】Apache Pig 将整个关系加载到 UDF【英文标题】:Apache Pig load entire relationship into UDF 【发布时间】:2012-12-08 11:05:16 【问题描述】:

我有一个涉及 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);

然后,我从“临时位置”加载每台机器以获取 A。这可行,但我有两个问题。

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

有人知道应该怎么做吗?

【问题讨论】:

A 和 B 是否有可以进行 JOIN 的列? 在这种情况下,是的,它们具有相同的数据并且可以加入。不过,我需要将 A 的每一行与 B 的每一行进行比较。我想我可以做一个交叉连接,但这不是效率更低吗?我将重新处理 B A - 比必要的多 1 倍,并且我将无法同时针对 A 的单行运行 B 的所有行,这是必需的。 你能发一个输入输出数据的例子吗? A: id: chararray,attributes: tuple_of_tokens: (token: chararray) 和 C 是一个包含两个字段元组的包,其中第一个字段是 A 的 id,第二个是一个包含那个 A 的 top N B 的元组。我希望有一个通用的解决方案。虽然这不是我需要在 UDF 中存储先前 pig 结果的唯一地方。 如果你可以在 id 列上加入,那么你可以使用用户复制加入,这是一个地图侧加入。 J = JOIN B by (id), A by (id) as 'replicated'; Apache Pig 将在每个数据节点的缓存中加载 A。比将 J 传递给 UDF,我认为这将发生在 Map 阶段,因此会很有效。 【参考方案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);

由于这是复制连接,它也只是映射端连接。

【讨论】:

我认为我目前的解决方案是将 A 保存在 HDFS 中,然后将其加载到我所有的减速器中,这比采用笛卡尔积更有效。希望找到一种非 hacky 的方式来完成这一切而无需任何技巧。 对不起,我把 A 和 B 弄混了。我认为 A 的关系更大,B 的关系更小。我已经更改了我的代码。我拥有的代码根本不是笛卡尔积,它只是 map-side join 所以非常有效,您不必处理 UDF 中的读取/解析 A (假设您想在本地模式下测试它,然后您的UDF 不起作用) GROUP ALL 不是 map-side,只有 join 是 @DexinWang 不确定这是否真的有效。你测试过吗?你有参考吗?

以上是关于Apache Pig 将整个关系加载到 UDF的主要内容,如果未能解决你的问题,请参考以下文章

Pig 将关系作为参数传递给 UDF

Apache Pig - 在猪关系中加载时缺少数字数据

如何从 Yahoo PigLatin UDF 中将文件加载到 DataBag 中?

在 Pig 中将关系传递给 Python UDF 时出错

根据 APACHE PIG 中的条件加载数据

如何使用 apache pig 将标题行加入多个文件中的详细行