Pig:加入后字段不存在

Posted

技术标签:

【中文标题】Pig:加入后字段不存在【英文标题】:Pig: field does not exist after join 【发布时间】:2017-05-18 07:08:44 【问题描述】:

似乎我在加入后以某种方式删除了一个密钥。

上下文

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

作为一个新手,我希望获得实现这一目标的最佳实践的指导,以及任何关于我为什么会出现“投影场”错误的 cmet。

我的尝试

-- 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。

【问题讨论】:

如果有用:在 Python 的 Pandas 中,这很简单:new_table_2 = table_2[table_2['member_id'].isin(set(table_1['member_id']))] 嗨,Quetzalcoatl,我注意到的一件事是成员 ID,它需要是猪脚本最后一行中的 member_id --> new_table_2 另外请检查您在此脚本中的不同方式 --> table_1_ids 将成员 ID 固定为 member_id。还有什么建议吗? 我想知道它是否像加载不同命名的 member_id 字段一样简单,例如table_1 = LOAD '$path_1' as (day, member_id_1, country); table_2 = LOAD '$path_2' as (day, member_id_2, country);然后加入 member_id_1 和 member_id_2 【参考方案1】:

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

【讨论】:

谢谢,:: 语法在这种情况下也很有帮助。【参考方案2】:

感谢@piyush 和@Nazar 的cmets。 获得所需结果的一种方法是 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;

【讨论】:

以上是关于Pig:加入后字段不存在的主要内容,如果未能解决你的问题,请参考以下文章

pig - 将数据从行转换为列,同时为特定行中不存在的字段插入占位符

APACHE PIG - 模式中不存在错误投影字段 [Units_Sold]:group:chararray,D2:bag:tuple(Item_Type:chararray,Units_Sold:i

mysql 用sql判断表里是不是存在某个字段,不存在加入新字段

pig 示例 apache [输入路径不存在]

在 PIG 中如何投影包中存在的明确字段?

错误包 org.apache.pig.FilterFunc 不存在