Optimization 如何在awk中编写优化的reducer

Optimization 如何在awk中编写优化的reducer,optimization,hadoop,map,awk,reduce,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 BANAN

我有下面的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

取决于优化的定义,当前解决方案的局限性在于它必须在关联数组中维护整个结果集。另一种方法是将字段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与以前的值进行比较,如果匹配,则更新计数,否则输出以前的值和计数。使用此方法,您可以边走边输出结果。我不知道使用此算法的性能成本,但正如我前面所说,它不受内存限制:

BEGIN {
  FS = "\t";
  OFS = "\t";
}
{ 
  if ($1 != prev) { 
    if (prev != "") { print prev, count;} 
    prev=$1; 
    count=0;
  }
  count += $2 
}
END { 
  print prev, count
}
当然,根据您的输入数据和您实际寻找的优化类型,可能会有其他选择



当然,根据您的输入数据和您实际寻找的优化类型,可能会有其他选择。

您需要添加其他信息,说明您为什么认为这没有优化。如果您希望能够以不同的顺序输出数据,而不是使用
for(a中的i)
获得的任意版本,则必须通过编辑问题来指定所需的输出。祝你好运。我期待回答2中的代码。但这就是减速器相位的误差。你能不能给我一些解决办法,比如回答2你的样本输入有问题。Hadoop框架将具有相同键的所有元组组合在一起。例如,您的输入在输入的开始处显示“APPLE”键,然后再次接近输入的结尾。这不会发生。所有以“APPLE”为键的元组都将在一起,中间没有其他键。上面的输入是通过hadoop流api从mapper到reducer的。我刚刚复制了上面的映射结果作为输入。我正在通过流式api在hadoop集群中尝试此reducer代码。Chris的答案正是您想要的,它应该可以正常工作。你为什么认为它不起作用?你得到了什么结果?你需要添加额外的信息,说明为什么你认为这是没有优化的。如果您希望能够以不同的顺序输出数据,而不是使用
for(a中的i)
获得的任意版本,则必须通过编辑问题来指定所需的输出。祝你好运。我期待回答2中的代码。但这就是减速器相位的误差。你能不能给我一些解决办法,比如回答2你的样本输入有问题。Hadoop框架将具有相同键的所有元组组合在一起。例如,您的输入在输入的开始处显示“APPLE”键,然后再次接近输入的结尾。这不会发生。所有以“APPLE”为键的元组都将在一起,中间没有其他键。上面的输入是通过hadoop流api从mapper到reducer的。我刚刚复制了上面的映射结果作为输入。我正在通过流式api在hadoop集群中尝试此reducer代码。Chris的答案正是您想要的,它应该可以正常工作。你为什么认为它不起作用?你得到了什么结果?谢谢你的回复,上面的代码和我上面的代码完全一样。但是我正在寻找下面的代码,但是这是一个错误。@NagarajVittal-你否决了这个吗???你要求优化代码,这就是我给你的。由于使用了print而不是printf,它更简洁,应该运行得更快。我不反对你的答案,但没有获得另一种优化代码来比较性能的方法。谢谢你的回复,上面的代码与我上面的代码完全相同。但我正在寻找下面的代码,但这是一个错误。@NagarajVittal-你否决了这个吗???你要求优化代码,这就是我给你的。由于使用了print而不是printf,它更简洁,应该运行得更快。我不反对你的答案,但没有获得另一种优化代码来比较性能的方法。谢谢你的回复。我正在寻找这种解决方案,但不幸的是,对于上面的代码,我在reducer阶段遇到了错误。对不起,我在BEGIN部分使用了单引号而不是双引号-我已经更新了上面的代码片段,以反映这段代码仍然不起作用。为供参考,我添加了有问题的示例输入和预期输出。输入包含一个空字符串作为键。您是在真实的Hadoop安装中测试此代码,还是在bash中使用示例输入测试它(没有Hadoop)?如果您正在执行后一种操作,它可能无法工作,因为您的示例输入有错误。具有相同键的所有元组将一起(一个接一个)发送到reducer。您的示例输入显示相同的键在输入中稀疏出现。我使用@cabad。如果您输入的减缩器未排序,则您不在减缩器中。它是如何不工作的?是否有错误或只是输出错误。该脚本适用于我通过脚本传送的一些示例输入。感谢您的回复。我正在寻找这种解决方案,但不幸的是,对于上面的代码,我在reducer阶段遇到了错误。对不起,我在BEGIN部分使用了单引号而不是双引号-我已经更新了上面的代码片段,以反映这段代码仍然不起作用。为供参考,我添加了有问题的示例输入和预期输出。输入包含一个空字符串作为键。您是在真实的Hadoop安装中测试此代码,还是在bash中使用示例输入测试它(没有Hadoop)?如果您正在执行后一种操作,它可能不起作用,因为您的samp