Pig:加入

时间:2017-05-18 07:08:44

标签: hadoop apache-pig inner-join

似乎我在加入后以某种方式移除了一个键。

上下文

目标是从table_2获取仅包含来自table_1的不同成员ID的所有记录。

作为一名新手,我非常感谢能够实现这一目标的最佳实践指南以及有关我为什么会出现“预计字段”错误的任何评论。

我尝试了什么

-- assume %default vals set for path_1 and path_2 to data

-- load the data

table_1 = LOAD '$path_1' as (day, member_id, country);
table_2 = LOAD '$path_2' as (day, member_id, country);

-- get distinct member_id's from table_1

table_1_ids = DISTINCT(FOREACH table_1 GENERATE member_id as member_id);

-- get all records from table_2 that only have table_1_ids

new_table_2 = JOIN table_1_ids BY member_id, table_2 BY member_id;

错误

无效的字段投影。架构中不存在投影字段[member_id]:table_1_ids :: member_id:bytearray,table_2 :: day:bytearray,table_2 :: member_id:bytearray,table_2 :: country:bytearray。

2 个答案:

答案 0 :(得分:0)

首先,您在加入后没有提供脚本,但我假设您有一些generate语句。加入后,所有列都重命名为<alias_name>::<field_name>。由于您在两个别名中都有相同名称的字段(member_id),因此在加入后您无法通过它的简单名称来引用它。您必须使用它的全名table_1_ids::member_idtable_2::member_id(它们具有相同的值,但它们在联接结果中仍然是2个不同的字段)。希望这可以帮助。

答案 1 :(得分:0)

感谢@piyush和@Nazar的评论。 获得所需结果的一种方法是:i)唯一标记要加入的键,以及ii)分离不同的语句:

table_1 = LOAD '$path_1' as (day, member_id_1, country); 
table_2 = LOAD '$path_2' as (day, member_id_2, country);
all_table_1_ids = FOREACH table_1 GENERATE member_id_1 as member_id_1;
distinct_table_1_ids = DISTINCT all_table_1_ids;
new_table_2 = JOIN distinct_table_1_ids BY member_id_1, table_2 BY member_id_2;