pig:join后字段不存在

svdrlsy4  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(401)

好像我在加入后不知何故把钥匙取下来了。
上下文
我们的目标是从表2获取所有记录,这些记录只包含表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\u id]:表\u 1\u id::member\u id:bytearray,表\u 2::day:bytearray,表2::成员id:bytearray,表2::country:bytearray.

eni9jsuy

eni9jsuy1#

首先,你没有在join之后提供脚本,但是我假设你有一些 generate 声明。联接后,所有列都重命名为 <alias_name>::<field_name> . 就像你在野外一样( member_id )如果两个别名中的名称相同,那么join之后就不能用它的简单名称来引用它。你得用它的全名 table_1_ids::member_id 或者 table_2::member_id (它们具有相同的值,但在联接结果中仍然是两个不同的字段)。希望这有帮助。

gtlvzcf8

gtlvzcf82#

感谢@piyus和@nazar的评论。获得所需结果的一种方法是i)唯一地标记要连接的键,以及ii)分离distinct语句:

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;

相关问题