如何在awk中编写优化的reducer

3zwjbxry  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(413)

我有下面的awk减缩程序,它在计算键值对中的值时运行良好。


# !/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
qoefvg9y

qoefvg9y1#

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

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

wfauudbj2#

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

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

相关问题