Hadoop Mapreduce CSV作为关键字:单词

时间:2018-10-28 19:10:09

标签: java hadoop mapreduce

我找不到我的问题的答案,如果有类似的帖子,请在那儿发给我。

我有一个要在其上执行mapreduce的CSV文件,CSV的格式为两列:概要。我希望能够对每本书进行mapreduce,并对每本书中的单词计数,因此,我希望输出为:图书标题:令牌。

到目前为止,我已经尝试使用以下代码来实现这一目标:

    String firstBook = null;
    while (itr.hasMoreTokens()) {
        String secondBook = itr.nextToken();
        if (firstBook != null) {
              word.set(firstBook + ":" + secondBook);
              context.write(word, one);
        }
        firstBook = secondBook;
      } 

这有时会输出以下内容; 单词:标题

此外,它限制了我只能进行的分析,因为这是我要在每个摘要中执行双字母组分析的逻辑。

有没有一种方法可以仅通过对CSV的“摘要”列执行mapreduce来隔离每个书名?如果是这样,我该怎么做并获得所需的输出?

非常感谢。

更新

该代码是从Hadoop wordcount示例中修改的,唯一的变化是在“ map”部分中,如上所示。您可以找到输入数据here

CSV文件的表示形式

Book title, Synopsis
A short history of nearly everything, Bill Byrson describes himself as a reluctant traveller...
Reclaiming economic development, There is no alternative to neoliberal economics - or so it appeared...

->请注意,我已简化了提要。

2 个答案:

答案 0 :(得分:0)

  

因此,我希望输出为:书名:令牌。

如果您复制单词计数示例,则只写了每两个标记,后面跟数字1。看起来好像带的不是标题,而是大纲的标记。但是您已经切断了获得标记器的部分,因此很难说清。

注意:如果一本书的标题包含逗号,那么您最终将获得部分标题,作为当前方法摘要的一部分。如果可能的话,您应该将title列加引号,或者更好的是,如果该定界符至少将成为第一列的一部分,则不要在各列之间使用逗号(或任何其他常见的定界符)。

  

对每个提要中的双字母组进行分析。

如果要进行这种类型的分析,建议您首先清理列-删除大写和标点符号。词干可能还会产生更好的输出。

  

有没有办法隔离每个书名

当然,请在针对特定图书的第一列中添加if语句,并仅在该条件下写入上下文

否则,如果您的映射器仅将书名写为键,则它们将作为reduce函数的一部分被隔离

答案 1 :(得分:0)

这是通过使用“ KeyValueTextInputFormat”类解决的,这里有一些专门与该类相关的教程。这使我可以分离CSV文件,从而生成一个key:value对(在我的情况下,是书名:synopsis)。然后,您可以像平常一样对“值”执行还原,并将其作为“键:令牌”传递到还原阶段。