Pig:通过加载列表进行高效筛选

问题描述:

在Apache Pig(版本0.16.x)中,通过某个数据集字段的现有值列表筛选数据集的最有效方法是什么?Pig:通过加载列表进行高效筛选

例如,

输入(每@ inquisitive_mind的尖端已更新):一个线分隔文件每行一个值 my_codes.txt

'110' 
'100' 
'000' 

sample_data.txt

'110', 2 
'110', 3 
'001', 3 
'000', 1 

所需输出

'110', 2 
'110', 3 
'000', 1 

示例脚本

%default my_codes_file 'my_codes.txt' 
%default sample_data_file 'sample_data.txt' 
my_codes = LOAD '$my_codes_file' as (code:chararray) 
sample_data = LOAD '$sample_data_file' as (code: chararray, point: float) 
desired_data = FILTER sample_data BY code IN (my_codes.code); 

错误:

Scalar has more than one row in the output. 1st : ('110'), 2nd :('100') 
(common cause: "JOIN" then "FOREACH ... GENERATE foo.bar" should be "foo::bar") 

我还曾试图FILTER sample_data BY code IN my_codes;但 “IN” 的条款似乎需要括号。 我也试过FILTER sample_data BY code IN (my_codes);但得到的错误: A柱需要从一个关系预计它被用作标

+0

后续:如果现有的列表中小与正在查询的数据集相比,Pig中的* replicated * join比标准JOIN更有效。 – Quetzalcoatl

的my_codes.txt文件具有代码为行而不是列。既然你是加载到一个单一领域的代码应该是这样的下面

'110' 
'100' 
'000' 

或者,你可以使用JOIN

joined_data = JOIN sample_date BY code,my_codes BY code; 
desired_data = FOREACH joined_data GENERATE $0,$1; 
+0

此外,似乎计算上有利于选择过滤器加入,但在这种情况下它们可能同样密集(例如,如果my_codex.txt包含10亿条记录)? – Quetzalcoatl

+0

是的,过滤器是有利的。我怀疑“IN”会起作用,因为在早期版本的PIG中,您必须明确指定用逗号分隔的值并括在圆括号中。 –

+0

正确。即使有更新的版本,如果my_codes> 1000的值,“IN”看起来并不实际。因此,您的JOIN解决方案看起来最好 – Quetzalcoatl