2015-09-07 83 views
0

下面的代码工作得很好,但是当我已经有两个现有的袋(与他们的别名,假设S1和S2用于表示两套两个现有的袋),不知道如何调用UDF setDifference产生设置差异?我认为如果我手动构建一个额外的包,使用我现有的输入袋(S1和S2),这将是额外的开销?Hadoop的猪UDF调用的问题,

register datafu-1.2.0.jar; 
define setDifference datafu.pig.sets.SetDifference(); 

-- ({(3),(4),(1),(2),(7),(5),(6)} \t {(1),(3),(5),(12)}) 
A = load 'input.txt' AS (B1:bag{T:tuple(val:int)},B2:bag{T:tuple(val:int)}); 

F1 = foreach A generate B1; 
F2 = foreach A generate B2; 

differenced = FOREACH A { 
    -- input bags must be sorted 
    sorted_b1 = ORDER B1 by val; 
    sorted_b2 = ORDER B2 by val; 
    GENERATE setDifference(sorted_b1,sorted_b2); 
} 

-- produces: ({(2),(4),(6),(7)}) 
DUMP differenced; 

更新:

的问题是,假设我有两个包已经,如何调用UDF setDifference得到一套区别在哪里?我是否需要制造另一个包含两个独立包的超级包?谢谢。

在此先感谢, 林

回答

1

我看不出与UDF调用任何开销问题。

价:http://datafu.incubator.apache.org/docs/datafu/guide/set-operations.html,我们已就使用SetDifference方法的例子。

按照API(http://datafu.incubator.apache.org/docs/datafu/1.2.0/datafu/pig/sets/SetDifference.html)SetDifference方法接受袋作为输入并发射它们之间的区别。

N.B.请注意,输入袋必须进行分类。

在的示例代码片段共享,我没有看到该响应的需要下面的代码片段

F1 = foreach A generate B1; 
F2 = foreach A generate B2; 
+0

感谢的,你的意思是与F1和F2调用setDifference作为输入参数?谢谢。 –

+0

@ LinMa:在上面的代码片段中,我没有看到别名F1和F2的需要。参考。第一个链接共享我们有一个使用SetDifference方法的例子。 –

+0

对不起,我可能不清楚我的问题。我的意思是如果我已经有两个包,如何调用UDF setDifference?在代码示例中,它似乎假定从具有两个包的文件读取。 –