我在 Hadoop 上转储了 SO 记录。我想知道什么是回答以下问题的好方法
样本记录
<row Id="4" PostTypeId="1" AcceptedAnswerId="7" CreationDate="2008-07-31T21:42:52.667" Score="251" ViewCount="15207" Body="<p>I want to use a track-bar to change a form's opacity.</p>

<p>This is my code:</p>

<pre><code>decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
</code></pre>

<p>When I try to build it, I get this error:</p>

<blockquote>
 <p>Cannot implicitly convert type 'decimal' to 'double'.</p>
</blockquote>

<p>I tried making <strong>trans</strong> to <strong>double</strong>, but then the control doesn't work. This code has worked fine for me in VB.NET in the past. </p>
" 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="<c#><winforms><forms><type-conversion><opacity>" AnswerCount="13" CommentCount="25" FavoriteCount="23" CommunityOwnedDate="2012-10-31T16:42:47.213" />
我的第一次剪辑
Key = userid_hour
所以现在我可以知道每个用户按小时发帖的数量。然后我需要对这些数据进行后处理以选择每个用户的最大数量,然后查看最活跃的时间。
问题
我们还有哪些其他选择可以简化这个?
最佳答案
我想你已经尽可能简单了。
第一项工作为您提供每个用户每小时的帖子数
- 输入:记录
- 中级:k=用户+小时; v=1
- 输出:k=用户+小时; v=计数
第二个作业发现每个用户最活跃的时间。正如@pangea 指出的那样,这涉及降序二级排序。通常,每个 reducer 调用都会传递单个唯一键值的值。您可以使用分组比较器为单个 reducer 调用组合多个键值的值。在这里,分组比较器可以“指示 hadoop”将给定用户的所有复合键值组合在一起,以便将每个用户的所有每小时计数传递到对 reducer 的单个调用中。
- 输入:k=用户+小时; v=计数
- 中级:k=用户+计数; v=小时+计数
- 输出:k=用户; v=最活跃时间
第三个作业为您提供在特定时间(当然是按小时)达到最大输出的用户数。正如@pangea 指出的那样,这涉及到二次排序。
- 输入:k=用户; v=最活跃时间
- 中级:k=小时; v=1
- 输出:k=小时; v=number-users-most-active-this-hour
您可以强制对作业 3 使用单个 reducer,这将使您在 reducer 实例中保持状态并在 cleanup() 方法中排序/报告该数据——而不是添加第四个作业——但就是这样无法扩展的技术。在这种情况下,它起作用了,因为您最多有 24 个值要排序。
关于hadoop - MapReduce - 对于每个学生,学生发布最多帖子的时间是什么时候,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23523911/