MapReduce - 对于每个学生,学生发布最多帖子的时间是多少

时间:2014-05-07 17:00:47

标签: hadoop mapreduce hadoop2

我在Hadoop上转储了SO记录。我想知道回答以下问题的好方法是什么

示例记录

<row Id="4" PostTypeId="1" AcceptedAnswerId="7" CreationDate="2008-07-31T21:42:52.667" Score="251" ViewCount="15207" Body="&lt;p&gt;I want to use a track-bar to change a form's opacity.&lt;/p&gt;&#xA;&#xA;&lt;p&gt;This is my code:&lt;/p&gt;&#xA;&#xA;&lt;pre&gt;&lt;code&gt;decimal trans = trackBar1.Value / 5000;&#xA;this.Opacity = trans;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&lt;p&gt;When I try to build it, I get this error:&lt;/p&gt;&#xA;&#xA;&lt;blockquote&gt;&#xA;  &lt;p&gt;Cannot implicitly convert type 'decimal' to 'double'.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&#xA;&lt;p&gt;I tried making &lt;strong&gt;trans&lt;/strong&gt; to &lt;strong&gt;double&lt;/strong&gt;, but then the control doesn't work. This code has worked fine for me in VB.NET in the past. &lt;/p&gt;&#xA;" OwnerUserId="8" LastEditorUserId="2648239" LastEditorDisplayName="Rich B" LastEditDate="2014-01-03T02:42:54.963" LastActivityDate="2014-01-03T02:42:54.963" Title="When setting a form's opacity should I use a decimal or double?" Tags="&lt;c#&gt;&lt;winforms&gt;&lt;forms&gt;&lt;type-conversion&gt;&lt;opacity&gt;" AnswerCount="13" CommentCount="25" FavoriteCount="23" CommunityOwnedDate="2012-10-31T16:42:47.213" />

我的第一次剪辑

Key = userid_hour

所以现在我知道每个用户的点数按小时计算。然后,我需要发布处理此数据以选择每个用户的最大数量,然后查看最活跃的小时数。

问题

我们还有哪些其他选择来简化这个?

2 个答案:

答案 0 :(得分:1)

我认为你已经尽可能简单了。

第一份工作为您提供每位用户每小时的帖子次数

  • 输入:记录
  • 中级:k =用户+小时; V = 1
  • 输出:k =用户+小时; v =计数

第二个工作发现每个用户最活跃的小时。正如@pangea所指出的那样,这涉及到一种降序的二级排序。通常,每个reducer调用都会传递一个唯一键值的值。您可以使用分组比较器组合单个reducer调用的多个键值的值。这里,分组比较器可以“指示hadoop”将给定用户的所有复合键值组合在一起,以便将每个用户的所有每小时计数传递给对reducer的单个调用。

  • 输入:k =用户+小时; V =计数
  • 中级:k =用户+计数; V =小时+计数
  • 输出:k =用户; V =最活跃小时

第三个作业会计算出某个小时内最大输出量的用户数量(当然是按小时计算)。正如@pangea所说,这涉及到第二种排序。

  • 输入:k = user; V =最活跃小时
  • 中级:k =小时; V = 1
  • 输出:k =小时; V =数用户-最活跃-这小时

您可以强制使用单个reducer进行作业3,这样可以让您在reducer实例中保持状态并在cleanup()方法中对该数据进行排序/报告 - 而不是添加第四个作业 - 但这就是那种不扩展的技术在这种情况下,它可以工作,因为您最多可以排序24个值。

答案 1 :(得分:1)

您可以使用两个字段创建复合键:userId,hour。然后,您可以按两个字段对键进行排序,并按userId对它们进行分组。对于reducer中的每个userId,您将必须遍历已排序的小时列表,并且可以使用最大的帖子量轻松计算小时数。