我有一个属于 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);
Run Code Online (Sandbox Code Playgroud)
然后我让每台机器从“templocation”加载到 A.This 工作,但我有两个问题。
有谁知道应该怎么做?
这是一个对你有用的技巧。
您首先对 A 执行 GROUP ALL,将 A 中的所有数据“打包”到一个字段中。然后人为地在A和B上添加公共字段并将它们连接起来。这样,对于增强 B 中的每个元组,您将拥有 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);
Run Code Online (Sandbox Code Playgroud)
由于这是复制连接,因此它也只是映射端连接。