Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache pig Apache Pig:在一个包中合并多个记录_Apache Pig - Fatal编程技术网

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。