Pig Latin JOIN操作问题:关联后出现重复id字段,我操作有误在哪?
问题原因与解决办法
嘿,这个场景我之前处理过!你遇到的重复id字段,其实是这类关联操作的默认行为——当你用JOIN A by id, B by id时,数据工具会把两个数据集里的id都保留下来,因为它默认把这两个id看作来自不同表的独立字段(哪怕名字完全相同),所以就出现了重复列。
给你几个实用的解决思路,按需选就行:
1. 用USING替代BY(优先推荐,如果你的工具支持)
很多数据处理工具(比如Apache Pig、Spark SQL这类)都支持USING语法来关联同名字段,它会自动合并重复的关联字段,只留一个。把你的关联语句改成这样就行:
AB= JOIN A USING id, B USING id;
这样生成的AB数据集里就只有一个id字段,同时完整保留两个表的其他所有字段,一步到位。
2. 手动筛选字段去重
如果你的工具不支持USING,那就在关联后手动去掉重复的id:
可以用
FOREACH+EXCLUDE来快速排除重复字段:AB= JOIN A by id, B by id; AB= FOREACH AB GENERATE A::id AS id, A::*, B::* EXCLUDE id;这里
A::id明确取A表的id作为保留的列,B::* EXCLUDE id则会把B表除了id之外的所有字段都加进来,完美避免重复。或者更直白一点,直接列出所有需要的字段:
AB= JOIN A by id, B by id; AB= FOREACH AB GENERATE id, A::field1, A::field2, B::field3, B::field4;把你需要的字段逐个列出来,只选一次
id就行(因为两个表的id是关联字段,值肯定一致,选哪个都没问题)。
3. 关联前重命名id(可选,适合特殊场景)
如果之后需要区分两个表的id(不过你这里不需要),可以先给其中一个表的id改名,关联后再删掉多余的:
B= FOREACH B GENERATE id AS b_id, * EXCLUDE id; AB= JOIN A by id, B by b_id; AB= FOREACH AB GENERATE id, A::*, B::* EXCLUDE b_id;
不过这个方法对你的需求来说有点绕,除非有特殊需求,不然没必要用。
总的来说,优先用USING语法,能最简洁地解决问题;如果工具不支持,手动筛选字段也很方便。
内容的提问来源于stack exchange,提问作者AKD
相关产品推荐
相关产品推荐

