我正在尝试分析大型犯罪统计数据集,该文件大约是2 GB的CSV格式。大约有20列,但我只对它的一个子集感兴趣:Crime_Type和Crime_in_Year。例如,犯罪类型“入室盗窃”,它发生在2001年至2013年,每年。我希望得到一个结果,计算每年入室盗窃的发生率。
所以我想要一个密钥,这个值将是它在2003年出现的总和。是否有可能在hadoop / mapreduce中有一对值作为关键?
答案 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>
最后你会得到总数。一年一度的犯罪。