【问题标题】:Dynamic counter HadoopHadoop动态计数器
【发布时间】:2019-04-17 18:25:41
【问题描述】:

我需要一些有关 Hadoop 中 Mapreduce 作业的帮助。 我有以下问题。我有一个包含多个文档+文档类别的大型数据集。我需要计算每个类别文档中每个术语的卡方值。这意味着,我需要每个类别每个术语的出现次数 + 每个类别的文档数量。

我的方法是使用 Mapreduce 作业来计算每个类别中每个单词的出现次数:

输入映射器:(docId, TextOfDocument) -> ({term, category}, docID) 减速器:(术语,{category,NumberOfOccurences})

这样做的问题是,我丢失了每个类别的文档数量信息,我在下一份工作中需要这些信息来计算卡方值。

我想到了以下解决方案:

1) 在读取文档时,使用每个类别的计数器来存储每个类别的文档数量。我认为这将是最好和最简单的解决方案。问题是,我不知道类别的数量,因此我需要动态增加计数器的数量。我没有找到在 Hadoop 中执行此操作的方法(创建动态增加的计数器)?有没有办法,我该怎么做?

2) 首先,运行一个作业并计算每个类别的文档数量并以某种方式存储它。我不知道如何检索数据或存储以某种方式方便我在阅读整个文档时可以阅读。

3) 以某种方式使用数据类型的额外值对其进行分区并以某种方式对其进行计数。

谁能帮我解决这个问题?哪种方法最好?还是有其他方法? 感谢您的帮助!

【问题讨论】:

  • 如果我是你,我会使用 spark 而不是 hadoop 来完成这项工作。那是因为您可以一次将数据加载到 RDD 中,然后运行多个映射和/或顺序映射并对其进行归约。我正在考虑为您在循环工作中解决上述问题找到解决方案。我希望能找到一个;)

标签: java hadoop mapreduce bigdata counter


【解决方案1】:

我想我终于可以找到一个解决方案来一次计算每个类别的术语计数和每个类别的文档数。

在你的地图阶段,你应该提取你需要的东西,然后你的输入和输出应该是这样的:

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

C_AFFIX 和 CT_AFFIX: 只是帮助这两种不同类型的键不会相互混合的标识符。

在你的减少阶段,你应该像计算字数经典问题一样,只计算和排序到输出:

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

C_AFFIX 和 CT_AFFIX 可以帮助每个类型的每个输出记录彼此相邻。

【讨论】:

  • 非常感谢!它有效,但现在我遇到了如何检索每个类别的文档数量以用于下一个工作的问题。
  • "1. " 正好用于检索每个类别的文档数。实际上,它会计算在每个文档中看到的类别数量。
  • 如果您彻底了解上述解决方案如何为您工作,请告诉我。结果有希望吗?
  • 抱歉回复晚了!但它奏效了!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 2013-05-14
相关资源
最近更新 更多