我目前正在使用烫伤工作mapreduce工作。我正在根据我在typedpipe中的行中看到特定值的次数来尝试阈值。例如,如果我在typedpipe中有这些行:
我想在每行中追加频率,我看到每一行的第1列和第2列的值。意思是输出看起来像:
目前,我是通过按类别对类型管道进行分组来实现的,如下所示:
val key2Freqs = input.groupBy('key2) {
_.size('key2Freq)
}.rename('key2 -> 'key2Right).project('key2Right, 'key2Freq);
然后用key2Freqs加入原始输入,如下所示:
.joinWithSmaller('key2 -> 'key2Right, key2Freqs, joiner = new LeftJoin)
然而,这真的很慢,在我看来这对于本质上非常简单的任务而言效率非常低。它变得特别长b / c我有6个不同的键,我想得到这些值,我目前正在我的工作中映射和加入6个不同的时间。必须有更好的方法来做到这一点,对吗?
答案 0 :(得分:0)
如果每列中不同值的数量足够小以使其全部适合内存,您可以.map
将列Map[String,Int]
添加到.groupAll.sum
,然后MapMonoid
将它们全部计算在内一气呵成(我使用的是“打字的api”表示法,不太清楚在api字段中是如何完成的,但你明白了)。您需要使用algebird中的Map
,或者如果您不想为这一项添加依赖项,请自行编写,这并不难。
然后,您最终会得到一个管道,其中包含生成的.crossWithTiny
的单个条目。现在,您可以获取原始管道,并.map
将带有计数的地图带入其中,然后a
提取个别计数。
否则,如果你不能把所有这些都留在记忆中,那么你现在在做什么似乎是唯一的方法......除非你实际上在寻找“顶级击球手”的近似值,而不是确切的数量整个宇宙......在这种情况下,请查看algebird的SketchMap。