我正在尝试分析一个大型犯罪统计数据集,该文件约为 2 GB 的 CSV 格式。大约有 20 列,但我只对其中的一个子集感兴趣:Crime_Type 和 Crime_in_Year。例如,犯罪类型“入室盗窃”,从 2001 年到 2013 年,每年都会发生。我想要一个计算每年入室盗窃事件的结果。
所以我想有一个 key ,其值将是它在 2003 年出现的总和。是否可以在 hadoop/mapreduce 中有一对值作为 key ?
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 更高级别的抽象,例如Cascading或Apache Spark。
一个可能的对是: 在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>
最后你会得到总数。每年的犯罪。