【问题标题】:Apache Pig: Combine multiple records within a bagApache Pig:在一个包中组合多个记录
【发布时间】:2015-06-09 02:17:53
【问题描述】:

对此的任何帮助将不胜感激!最好的方法是举个例子:

输入:

架构:

姓名|电话类型|电话号码

示例数据:

凯尔|细胞|555-222-3333

凯尔|首页|453-444-5555

汤姆|首页|555-555-5555

汤姆|寻呼机|555-555-4344

期望的输出:

架构:

名称|Home_num|Cell_num|Pager_num

例子:

凯尔|453-444-5555|555-222-3333|空

汤姆|555-555-5555|null|555-555-4344

代码:

data=Load 'test.txt' using PigStorage('|');

grpd= Group data by $0;

Foreach grpd{
    ???
}

【问题讨论】:

    标签: apache-pig


    【解决方案1】:

    经过@Murali lao的评论,我重写了解决方案。

    我现在用的是FILTER,然后用FLATTEN不过滤空包的窍门就是在包空的时候加一个空字符串。

    这是我的测试数据:

    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)
    

    【讨论】:

    • pager 为空值时如何处理?我试图在生成中添加一个 if else 并且只得到错误
    • 另外,由于 home、cell 和 pager 都是袋子,我相信它们需要被压平
    • 我只是编辑我的帖子以添加一个示例以将空值替换为 ''。是的,你必须把袋子压平。
    • 嵌套 FOREACH 语句不支持 SPLIT。我们必须去过滤器。 home = 按电话类型过滤 $1 == '家';同样适用于单元格和寻呼机。同样在应用 FLATTEN 之前,必须检查该值是否为 NOT NULL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2022-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    相关资源
    最近更新 更多