關於Mapreduce Text型別賦值的錯誤

xppp11發表於2021-04-28

Mapreduce中Text型別資料被無緣無故替換?

​ 今天偶然看到一個mapreduce demo,直接上手操作

統計兩個檔案中 最大值

檔案截圖

檔案中資料格式為 名字 數值

輸出為 名字(最大值所對應的名字) 最大值 例如:豪玉 2201

一通編碼,但是居然出現如下的結果

執行結果

趕緊去檢視了程式碼,如下

map階段就是找出兩個檔案中各自的最大值

//map階段

protected void map(LongWritable key,Text value,Context context) throws IOException,
            InterruptedException {
        // 拋棄無效記錄
        String [] line = value.toString().split(" ");
        // 把line轉換為數值
        long temp = Long.parseLong(line[1]);
        // 比較大小
        if (temp >= max) {
            name1 = line[0];
            // 把val賦值給tempMax
            max = temp;
        }
    }
protected void cleanup(Context context) throws IOException, InterruptedException {
        maxValue.set(max);
        name.set(name1);
        context.write(name,maxValue);
    }

reduce階段再進行一次比較

//reduce階段如下

private Long max = Long.MIN_VALUE;
private Text mname = new Text();
private String name;
private Text name2 = new Text();
protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException
    {
        for(LongWritable value : values){
            System.out.println(key+value.toString());
            if (value.get()>=max)
            {
                System.out.println("此時的最大值"+value.get());
                name2 = key;
                max = value.get();
            }
        }
    }

protected void cleanup(Context context) throws IOException, InterruptedException {
        // 設定最大值
        LongWritable maxValue = new LongWritable();
        maxValue.set(max);
        mname.set(name2);
        context.write(mname,maxValue);
    }

於是開始無腦輸出測試

先測試了進入reduce端的資料,無誤

進入reduce端的資料

測試進入reduce端 if判斷中的資料,無誤

if中的判斷

???

一通改,無果

偶然將 reduce 賦值語句用String型別賦值,發現結果無誤

name = key.toString();
執行結果

進而開始找尋原因,原來是Text型別賦值的時候需要例項化

name2 = new Text(key);

賦值修改如上,經測試無誤

相關文章