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柱需要从一个关系预计它被用作标
的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;
此外,似乎计算上有利于选择过滤器加入,但在这种情况下它们可能同样密集(例如,如果my_codex.txt包含10亿条记录)? – Quetzalcoatl
是的,过滤器是有利的。我怀疑“IN”会起作用,因为在早期版本的PIG中,您必须明确指定用逗号分隔的值并括在圆括号中。 –
正确。即使有更新的版本,如果my_codes> 1000的值,“IN”看起来并不实际。因此,您的JOIN解决方案看起来最好 – Quetzalcoatl
后续:如果现有的列表中小与正在查询的数据集相比,Pig中的* replicated * join比标准JOIN更有效。 – Quetzalcoatl