如何在awk中编写优化的reducer

时间:2013-07-28 12:55:49

标签: optimization hadoop map awk reduce

我有以下awk reducer程序,它在计算键值对中的值时效果很好。

#!/bin/awk -f

BEGIN {FS="\t";
}
{       A[$1]+=$2;      
}
END {
        for(i in A)    
        {printf("%s\t %d\n" ,i ,A[i])}
}

以上减速机运行良好,是否有任何优化的方式来编写它??

输入:

APPLE 1
APPLE 1
 1
ORANGE  1
ORANGE  1
MANGO 1
BANANA 1
 1
 1
 1
ORANGE  1
 1
APPLE 1
BANANA 1

输出:

APPLE 3
BANANA 2
MANGO 1
ORANGE 3
 5

2 个答案:

答案 0 :(得分:1)

取决于您对优化的定义 - 您当前的解决方案是有限的,因为它必须在关联数组中维护整个结果集。另一种方法是将字段1与先前的值进行比较,如果匹配则更新计数,否则输出先前的值和计数。使用此方法,您可以随时输出结果。我不知道使用这种算法的性能成本,但正如我之前所说,它不受内存限制:

BEGIN {
  FS = "\t";
  OFS = "\t";
}
{ 
  if ($1 != prev) { 
    if (prev != "") { print prev, count;} 
    prev=$1; 
    count=0;
  }
  count += $2 
}
END { 
  print prev, count
}

答案 1 :(得分:0)

BEGIN {FS="\t"; OFS="\t "}
{ A[$1]+=$2 }
END {
    for(i in A)    
        print i, A[i]
}

当然,根据您的输入数据以及您实际需要的优化类型,可能会有其他选择。