Hadoop:你能用一对值作为“Key”吗?

时间:2013-10-18 05:13:04

标签: hadoop mapreduce

我正在尝试分析大型犯罪统计数据集,该文件大约是2 GB的CSV格式。大约有20列,但我只对它的一个子集感兴趣:Crime_Type和Crime_in_Year。例如,犯罪类型“入室盗窃”,它发生在2001年至2013年,每年。我希望得到一个结果,计算每年入室盗窃的发生率。

所以我想要一个密钥,这个值将是它在2003年出现的总和。是否有可能在hadoop / mapreduce中有一对值作为关键?

2 个答案:

答案 0 :(得分:2)

Key可以是任何东西,只要它实现Writable即可。您可以非常轻松地编写自己的自定义密钥,如here所示。

所以借用文档,一个实现可能是

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;
       }
     }

在相关的说明中,您可能需要考虑使用比{-3}}或Cascading之类的map-reduce更高级别的抽象。

答案 1 :(得分:0)

一对可能的是: 在map()函数中生成键值对
(Crime_Year CrimeType,value)
将密钥设置为" Crime_Year Burglary"并将该值设为整数值。 这实际上意味着在给定的数据集中检查犯罪类型是否是"入室盗窃"然后用它连接Crime_Year并将此String设置为键,并将值设为整数1.

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

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

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


< 2001 burglary,2>
< 2002年入室盗窃案,1>
< 2003爆窃案,1>

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