java动态计数器hadoop

epggiuax  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(415)

我需要一些帮助mapreduce工作在hadoop。我有以下问题。我有一个包含多个文档+文档类别的大数据集。我需要计算每个类别文档中每个术语的卡方值。也就是说,我需要每个类别每个术语的出现次数+每个类别的文档数。
我的方法是有一个mapreduce工作,计算每个类别中每个单词的出现次数:
输入Map器:(docid,textofdocument)->({term,category},docid)reducer:(term,{category,numberOfOfOccurences})
问题是,我丢失了每个类别的文档数的信息,这是我在下一个工作中计算卡方值所需要的。
我想到了以下解决办法:
1) 读取文档时,使用每个类别的计数器存储每个类别的文档数。我认为这是最好最简单的解决办法。问题是,我不知道类别的数量,因此我需要动态增加计数器的数量。我没有在hadoop中找到一种方法(创建动态递增计数器)?有办法吗?我该怎么做?
2) 首先,运行一个作业,计算每个类别的文档数并以某种方式存储它。我不知道如何检索数据或存储某种程度上很方便,我可以在阅读整个文档的同时读入。
3) 用数据类型的额外值对其进行分区,并对其进行计数。
有人能帮我解决这个问题吗?哪种方法最好?或者有其他方法吗?谢谢你的帮助!

vmdwslir

vmdwslir1#

我想最后我可以找到一个解决方案来计算你的每一个类别的学期计数和每一个类别的文件数在一个通过。
在Map阶段,你应该提取你需要的东西,然后你的输入和输出应该是这样的:

<docId, TextOfDocument> --> 
1. "<C_AFFIX+category+C_AFFIX, 1>" 
2. "<CT_AFFIX+category+term+CT_AFFIX, 1>"

c\词缀和c\词缀:这两种不同类型的键只不过是为了帮助识别,而不是混淆。
在reduce阶段,你应该像经典的字数计算问题一样,对输出进行计数和排序:

int sum = 0;
for (IntWritable val : values) {
  sum += val.get();
}
result.set(sum);
context.write(key, result);

cï词缀和ctï词缀可以帮助每种类型座椅的每个输出记录相邻。

相关问题