【问题标题】:Pig Performance Issues猪性能问题
【发布时间】:2016-05-11 05:53:24
【问题描述】:

我有以下 PIG 脚本,它需要花费大量时间来处理 342 个文件,分割大小为 256 MB(仅限测试)。任何人都可以提出改进建议:

SPLIT filteredalnumcdrs into splitalnumcdrs_1 IF (
            (SUBSTRING(aparty,2,3) == '-')),
            splitalnumcdrs_2 OTHERWISE;

tmpsplitalnumcdrs_1 = FOREACH splitalnumcdrs_1 GENERATE aparty,srcgt,destgt,SUBSTRING(aparty,0,2) as splitaparty,bparty,smscgt,status,prepost;

groupsplitalnumcdrs_1 = GROUP tmpsplitalnumcdrs_1 BY (aparty,srcgt,destgt,splitaparty,bparty,smscgt,status,prepost);

distinctsplitalnumcdrs_1 = FOREACH groupsplitalnumcdrs_1 {
    uniqsplitalnumcdrs_1 = DISTINCT tmpsplitalnumcdrs_1.(aparty,srcgt,destgt,splitaparty,bparty,smscgt,status,prepost);
    GENERATE FLATTEN(group),COUNT(tmpsplitalnumcdrs_1) as countalnumcdrs;
    };

tmpsplitalnumcdrs_2 = FOREACH splitalnumcdrs_2 GENERATE aparty,srcgt,destgt,aparty as splitaparty_2,bparty,smscgt,status,prepost;
groupsplitalnumcdrs_2 = GROUP tmpsplitalnumcdrs_2 BY (aparty,srcgt,destgt,splitaparty_2,bparty,smscgt,status,prepost);

distinctsplitalnumcdrs_2 = FOREACH groupsplitalnumcdrs_2 {
    uniqsplitalnumcdrs_2 = DISTINCT tmpsplitalnumcdrs_2.(aparty,srcgt,destgt,splitaparty_2,bparty,smscgt,status,prepost);
    GENERATE FLATTEN(group),COUNT(tmpsplitalnumcdrs_2) as countsplitalnumcdrs_2;
    };

distinctalnumcdrs = UNION distinctsplitalnumcdrs_1,distinctsplitalnumcdrs_2;

alnumreportmap = FOREACH distinctalnumcdrs GENERATE aparty,smsiuc_udfs.mapgtabparty(srcgt,destgt,splitaparty,bparty),smscgt,status,prepost,countalnumcdrs PARALLEL 20;
alnumreportmapgroup = GROUP alnumreportmap BY (aparty,mappedreport,smscgt,status,prepost);
alnumreportmaprecord = FOREACH alnumreportmapgroup GENERATE FLATTEN(group),SUM(alnumreportmap.countalnumcdrs) as alnumsmscount;

【问题讨论】:

    标签: performance hadoop apache-pig bigdata


    【解决方案1】:

    你可以避免联合

    tmpsplitalnumcdrs = foreach filteredalnumcdrs generate aparty,srcgt,destgt,(SUBSTRING(aparty,2,3) == '-' ?SUBSTRING(aparty,0,2):aparty)  as splitaparty,bparty,smscgt,status,prepost;
    
    distinctsplitalnumcdrs = FOREACH tmpsplitalnumcdrs {
    uniqsplitalnumcdrs = DISTINCT tmpsplitalnumcdrs.(aparty,srcgt,destgt,splitaparty,bparty,smscgt,status,prepost);
    GENERATE FLATTEN(group),COUNT(tmpsplitalnumcdrs) as countsplitalnumcdrs;
    };
    

    为什么需要

    uniqsplitalnumcdrs = DISTINCT tmpsplitalnumcdrs.(aparty,srcgt,destgt,splitaparty,bparty,smscgt,status,prepost);
    

    【讨论】:

    • 但是您没有正确使用它。在组内,不同的将是您拥有它的原因。
    • 避免使用 UNION 会产生很好的影响。对于不同的,再次查看代码似乎DISTINCT tmpsplitalnumcdrs 会起作用。是它还是其他什么东西??
    • 我的意思是您可以删除该语句本身,因为您没有使用 uniqsplitalnumcdrs。删除语句 uniqsplitalnumcdrs = DISTINCT tmpsplitalnumcdrs.(aparty,srcgt,destgt,splitaparty,bparty,smscgt,status,prepost);
    • 你是对的,但我需要不同的行及其计数。假设filteredalnumcdrs 的总计数为 100,distinctsplitalnumcdrs 的行数为 52,那么distinctsplitalnumcdrs 的每一行必须包含求和结果为 100 的计数字段。
    • 但是你在哪里使用 uniqsplitalnumcdrs 它是本地的 foreach 你不能在外面使用它?
    猜你喜欢
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2017-04-13
    • 2022-01-04
    相关资源
    最近更新 更多