mapreduce代码中树Map大小始终为1

vh0rcniy  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(323)

我试图写一个代码,我试图获取前十名访问过该网站的IP地址。我有示例日志,第一个mr代码的输出如下所示:

01-dynamic-c.rotterdam.luna.net 1
01-dynamic-c.wokingham.luna.net 28
02-dynamic-c.wokingham.luna.net 13
03-dynamic-c.wokingham.luna.net 15
04-dynamic-c.rotterdam.luna.net 22

现在我想在第二个mr作业中计算topn,但在mapper中treemap大小总是1。看起来树Map上的put操作一直在替换我的旧条目。

private TreeMap<Text, Integer> repToRecordMap = new TreeMap<Text, Integer>();
int count = 0;

@Override
public void map(Text key, Text value, Context context)
        throws IOException, InterruptedException {
    System.out.println("key ==> " + key);
    System.out.println("value ==> "
            + Integer.parseInt(value.toString()));
    System.out.println("size ==> " + repToRecordMap.size());

    repToRecordMap.put(key, Integer.parseInt(value.toString()));

}

下面是system.out在日志中打印的内容:

key ==>***.novo.dk
value ==> 16

**size ==> 1**

key ==> 007.thegap.com
value ==> 45

**size ==> 1**

key ==> 01-dynamic-c.rotterdam.luna.net
value ==> 1

**size ==> 1**

每次我有一把新钥匙,但大小总是1,这意味着它总是用新钥匙替换我的旧钥匙。请帮帮我为什么会这样?
谢谢

0yg35tkg

0yg35tkg1#

您应该将文本对象转换为字符串并定义 Map<String, Integer> . mapreduce框架在可能的情况下重用可序列化对象以优化内存。我认为在您的例子中就是这样,文本对象是相同的(在对象级别上),即使它们表示不同的字符串。

相关问题