2

我正在尝试分析一个大型犯罪统计数据集,该文件约为 2 GB 的 CSV 格式。大约有 20 列,但我只对其中的一个子集感兴趣:Crime_Type 和 Crime_in_Year。例如,犯罪类型“入室盗窃”,从 2001 年到 2013 年,每年都会发生。我想要一个计算每年入室盗窃事件的结果。

所以我想有一个 key ,其值将是它在 2003 年出现的总和。是否可以在 hadoop/mapreduce 中有一对值作为 key ?

4

2 回答 2

2

AKey可以是任何东西,只要它实现Writable. 您可以很容易地编写自己的自定义密钥,如此处所示

因此,从文档中借用,一种实现可能是

public class CrimeWritable implements Writable {    
       private int year;
       private String type;

       public void write(DataOutput out) throws IOException {
         out.writeInt(year);
         out.writeBytes(type);
       }

       public void readFields(DataInput in) throws IOException {
         year = in.readInt();
         type = in.readBytes();
       }

       public static CrimeWritable read(DataInput in) throws IOException {
         CrimeWritable w = new CrimeWritable();
         w.readFields(in);
         return w;
       }
     }

在相关说明中,您可能需要考虑使用比 map-reduce 更高级别的抽象,例如CascadingApache Spark

于 2013-10-18T05:34:31.057 回答
0

一个可能的对是: 在map()函数中生成键值对为
(Crime_Year CrimeType, value)
将键设置为“Crime_Year Burglary”,并将值设为整数值。这实际上意味着在给定的数据集中检查犯罪类型是否为“入室盗窃”,然后将 Crime_Year 与其连接并将此字符串设置为键,并将值设为整数 1。

reduce()总结所有具有相同键的值。

示例: map()输出:
<2001 入室盗窃,1>
<2001 入室盗窃,1>
<2002 入室盗窃,1>
<2003 入室盗窃,1>

reduce()输出(总结相同键的值):


<2001 入室盗窃,2>
<2002 入室盗窃,1>
<2003 入室盗窃,1>

最后你会得到总数。每年的犯罪。

于 2016-01-28T10:32:45.137 回答