我在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
所以现在我知道每个用户的帖子数小时。然后,我需要对这些数据进行post处理,以选择每个用户的最大计数,然后查看最活跃的小时数。
我们有什么其他的选择来简化这个?
我想你已经尽可能的简单了。
第一个job给出了每个用户每小时的帖子数
- <
- 输入:记录/gh>
- 中级:k =用户+小时;v = 1
- 输出:k =用户+小时;v =数
第二个作业发现每个用户最活跃的时间。正如@pangea所指出的,这涉及到降序的二级排序。通常,每个reducer调用都传递一个唯一键值的值。您可以使用分组比较器来组合单个reducer调用的多个键值。这里,分组比较器可以"指示hadoop"将给定用户的所有组合键值分组在一起,以便将每个用户的所有小时计数传递到对reducer的单个调用中。
- 输入:k =用户+小时;v =数
- 中级:k =用户+计数;v =时间+数
- 输出:k =用户;v = most-active-hour
第三个作业为您提供了在某一小时内最大输出下降的用户数量(当然是按小时计算)。正如@pangea所指出的,这涉及到二次排序。
- 输入:k =用户;v = most-active-hour
- 中间:k = 1小时;v = 1
- 输出:k = 1小时;v = number-users-most-active-this-hour
您可以强制为作业3使用单个reducer,这将允许您在reducer实例中保留状态,并在cleanup()方法中对数据进行排序/报告——而不是添加第四个作业——但这种技术无法扩展。在本例中,它可以工作,因为您最多有24个值要排序。
可以创建包含两个字段的组合键:userId, hour。然后可以按两个字段对键进行排序,并按userId对它们进行分组。对于reducer中的每个userId,您必须遍历已排序的小时列表,并且很容易计算出具有最大帖子数量的小时。