Apache pig Apache Pig:在一个包中合并多个记录
在此方面的任何帮助都将不胜感激!最好的方法是举个例子: 输入:Apache pig Apache Pig:在一个包中合并多个记录,apache-pig,Apache Pig,在此方面的任何帮助都将不胜感激!最好的方法是举个例子: 输入: data=Load 'test.txt' using PigStorage('|'); grpd= Group data by $0; Foreach grpd{ ??? } 模式: 名称|电话类型|电话号码 示例数据: 凯尔|细胞| 555-222-3333 凯尔之家453-444-5555 汤姆|家| 555-555-5555 汤姆|寻呼机| 555-555-4344 所需输出: data=Load 'test.t
data=Load 'test.txt' using PigStorage('|');
grpd= Group data by $0;
Foreach grpd{
???
}
模式:
名称|电话类型|电话号码
示例数据:
凯尔|细胞| 555-222-3333
凯尔之家453-444-5555
汤姆|家| 555-555-5555
汤姆|寻呼机| 555-555-4344
所需输出:
data=Load 'test.txt' using PigStorage('|');
grpd= Group data by $0;
Foreach grpd{
???
}
模式:
姓名|主页|单元格|寻呼机|号码
例如:
凯尔| 453-444-5555 | 555-222-3333 |空
汤姆| 555-555-5555 |空| 555-555-4344
代码:
data=Load 'test.txt' using PigStorage('|');
grpd= Group data by $0;
Foreach grpd{
???
}
在@Murali lao的评论之后,我重写了解决方案 我现在使用过滤器,然后诀窍不过滤空袋扁平是添加一个空字符串时,袋是空的 以下是我的测试数据:
tom,home,555
tom,pager,666
tom,cell,777
bob,home,111
bob,cell,222
以下是我的解决方案:
data = LOAD 'phone' USING PigStorage(',') AS (name:chararray, phone_type: chararray, phone_num: chararray);
user = FOREACH (GROUP data BY name) {
home = FILTER $1 BY phone_type == 'home';
-- you add an empty string if the the bag is empty
homenum = (IsEmpty(home) ? {('')} : home.phone_num);
pager = FILTER $1 BY phone_type == 'pager';
pagernum = (IsEmpty(pager) ? {('')} : pager.phone_num);
cell = FILTER $1 BY phone_type == 'cell';
cellnum = (IsEmpty(cell) ? {('')} : cell.phone_num);
GENERATE group as name, FLATTEN(homenum) as home, FLATTEN(pagernum) as pager, FLATTEN(cellnum) as cell;
};
转储后,我得到以下结果:
(bob,111,,222)
(tom,555,666,777)
如何处理寻呼机有空值的情况?我试图在generate和only get Errors中添加if-else,因为home、cell和pager都是包,所以它们需要展平。我相信我只是编辑了我的帖子,添加了一个用“”替换空值的示例。是的,您必须压平袋子。嵌套的FOREACH语句不支持拆分。我们必须使用过滤器。主页=按电话过滤$1_类型==“主页”;手机和寻呼机也是如此。同样,在应用展平之前,必须检查该值是否不为NULL。