使用Pig Latin(Hadoop)在内部包中插入元组的实现方案
实现目标Pig Latin关系结构方案
嘿,你已经搞定了数据加载和按(userid, day)分组的核心步骤,现在只需要微调一下内部包的字段结构,就能得到你想要的userid, day, {(pid,fulldate, x,y),...}格式啦!
具体实现代码
你可以通过FOREACH嵌套遍历的方式,重新构造分组内的元组集合:
-- 对分组后的B关系进行处理,提取目标字段 C = FOREACH B { -- 遍历每个分组内的A包,只保留我们需要的pid、fulldate、x、y字段 target_purchases = FOREACH A GENERATE pid, fulldate, x, y; -- 生成最终的关系结构:拆分group中的userid和day,加上处理后的元组包 GENERATE group.userid AS userid, group.day AS day, target_purchases AS purchases; }
代码解释
- 外层
FOREACH B:遍历每个已经按(userid, day)分好的组 - 内层
FOREACH A:针对每个组里的原始数据集合A,筛选出我们需要的四个字段,生成新的元组集合target_purchases - 最后
GENERATE:把分组键group里的userid和day单独提取出来作为顶层字段,再加上处理后的元组包,就是你想要的最终结构啦
验证结果
执行DESCRIBE C查看关系结构,你会得到符合预期的输出:
C: {userid: chararray, day: int, purchases: {(pid: chararray, fulldate: chararray, x: chararray, y: chararray)}}
可选优化(字段别名)
如果想要明确标注内部元组的字段名(避免歧义),可以在生成元组时指定别名,虽然原始字段名已经匹配,但这样会更清晰:
target_purchases = FOREACH A GENERATE pid AS pid, fulldate AS fulldate, x AS x, y AS y;
内容的提问来源于stack exchange,提问作者AKD
相关产品推荐
相关产品推荐

