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_id
或 table_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