猪:加入后字段不存在
Pig: field does not exist after join
似乎我在加入后删除了一个密钥。
上下文
目标是从 table_2 中获取仅包含来自 table_1 的不同成员 ID 的所有记录。
作为新手,我希望获得实现此目标的最佳实践中的指示,以及任何关于我为什么会收到 "projected field" 错误的评论。
我试过的
-- 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.
首先你没有提供加入后的脚本,但我假设你有一些 generate
语句。加入后,所有列都重命名为 <alias_name>::<field_name>
。由于您在两个别名中都有同名的 field(member_id
) ,因此在加入后您不能通过它的简单名称来引用它。您必须使用它的全名 table_1_ids::member_id
或 table_2::member_id
(它们具有相同的值,但它们在连接结果中仍然是 2 个不同的字段)。希望这可以帮助。
感谢@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;
似乎我在加入后删除了一个密钥。
上下文
目标是从 table_2 中获取仅包含来自 table_1 的不同成员 ID 的所有记录。
作为新手,我希望获得实现此目标的最佳实践中的指示,以及任何关于我为什么会收到 "projected field" 错误的评论。
我试过的
-- 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.
首先你没有提供加入后的脚本,但我假设你有一些 generate
语句。加入后,所有列都重命名为 <alias_name>::<field_name>
。由于您在两个别名中都有同名的 field(member_id
) ,因此在加入后您不能通过它的简单名称来引用它。您必须使用它的全名 table_1_ids::member_id
或 table_2::member_id
(它们具有相同的值,但它们在连接结果中仍然是 2 个不同的字段)。希望这可以帮助。
感谢@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;