我找不到我的问题的答案,如果有类似的帖子,请在那儿发给我。
我有一个要在其上执行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...
->请注意,我已简化了提要。
答案 0 :(得分:0)
因此,我希望输出为:书名:令牌。
如果您复制单词计数示例,则只写了每两个标记,后面跟数字1。看起来好像带的不是标题,而是大纲的标记。但是您已经切断了获得标记器的部分,因此很难说清。
注意:如果一本书的标题包含逗号,那么您最终将获得部分标题,作为当前方法摘要的一部分。如果可能的话,您应该将title列加引号,或者更好的是,如果该定界符至少将成为第一列的一部分,则不要在各列之间使用逗号(或任何其他常见的定界符)。
对每个提要中的双字母组进行分析。
如果要进行这种类型的分析,建议您首先清理列-删除大写和标点符号。词干可能还会产生更好的输出。
有没有办法隔离每个书名
当然,请在针对特定图书的第一列中添加if语句,并仅在该条件下写入上下文
否则,如果您的映射器仅将书名写为键,则它们将作为reduce函数的一部分被隔离
答案 1 :(得分:0)
这是通过使用“ KeyValueTextInputFormat”类解决的,这里有一些专门与该类相关的教程。这使我可以分离CSV文件,从而生成一个key:value对(在我的情况下,是书名:synopsis)。然后,您可以像平常一样对“值”执行还原,并将其作为“键:令牌”传递到还原阶段。