我正在尝试分析一个大型犯罪统计数据集,该文件约为 2 GB,采用 CSV 格式。大约有 20 列,但我只对其中的一个子集感兴趣:Crime_Type 和 Crime_in_Year。例如,犯罪类型"入室盗窃",从2001年到2013年每年都会发生。我想得到一个计算每年入室盗窃事件的结果。
所以我正在考虑有一个密钥,该值将是它在 2003 年出现的总和。是否有可能在hadoop/mapreduce中将一对值作为键?
Key
实现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犯罪类型,值)
将密钥设置为"Crime_Year入室盗窃",并让该值为整数值。这实际上意味着在给定的数据集中检查犯罪类型是否为"入室盗窃",然后将Crime_Year与其连接并将此字符串设置为键,并让值为整数 1。
在reduce()
中,汇总具有相同键的所有值。
例: map()
输出:
<2001年入室盗窃案,1>
<2001年入室盗窃案,1>
<2002年入室盗窃案,1>
<2003年入室盗窃案,1>
reduce()
输出(将相同键的值相加):
<2001年入室盗窃案,2>
<2002年入室盗窃案,1>
<2003年入室盗窃案,1>
最后,您将获得每年的犯罪总数。