如何计算烫印中类型管道中行的列数?

时间:2016-02-11 22:18:25

标签: scala hadoop mapreduce scalding

我目前正在使用烫伤工作mapreduce工作。我正在根据我在typedpipe中的行中看到特定值的次数来尝试阈值。例如,如果我在typedpipe中有这些行:

第1栏|第2栏

'hi'| '嘿'

'hi'| 'HO'

'hi'| 'HO'

'再见'| '再见'

我想在每行中追加频率,我看到每一行的第1列和第2列的值。意思是输出看起来像:

第1栏|第2栏|第1列Freq |第2栏频率

'hi'| “哎” | 3 | 1

'hi'| 'ho'| 3 | 2

'hi'| 'ho'| 3 | 2

'再见'| '再见'| 1 | 1

目前,我是通过按类别对类型管道进行分组来实现的,如下所示:

  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个不同的时间。必须有更好的方法来做到这一点,对吗?

1 个答案:

答案 0 :(得分:0)

如果每列中不同值的数量足够小以使其全部适合内存,您可以.map将列Map[String,Int]添加到.groupAll.sum,然后MapMonoid将它们全部计算在内一气呵成(我使用的是“打字的api”表示法,不太清楚在api字段中是如何完成的,但你明白了)。您需要使用algebird中的Map,或者如果您不想为这一项添加依赖项,请自行编写,这并不难。 然后,您最终会得到一个管道,其中包含生成的.crossWithTiny的单个条目。现在,您可以获取原始管道,并.map将带有计数的地图带入其中,然后a提取个别计数。

否则,如果你不能把所有这些都留在记忆中,那么你现在在做什么似乎是唯一的方法......除非你实际上在寻找“顶级击球手”的近似值,而不是确切的数量整个宇宙......在这种情况下,请查看algebird的SketchMap