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

  • 本文关键字:Key Hadoop hadoop mapreduce
  • 更新时间 :
  • 英文 :


我正在尝试分析一个大型犯罪统计数据集,该文件约为 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>

最后,您将获得每年的犯罪总数。

相关内容

  • 没有找到相关文章

最新更新