gpt4 book ai didi

hadoop - 我正在尝试在 MapReduce 中输出 {key, list(values)} 但我只得到排序的 {key,value} 对

转载 作者:可可西里 更新时间:2023-11-01 16:48:36 25 4
gpt4 key购买 nike

我的要求如下

input file 
key value
eid ename
1 a
2 b
3 c

o/p 文件

key   values
eid 1,2,3
ename a,b,c

我使用 header 数组和数据数组在我的映射器中编写了逻辑,并且案例 1:没有 Reducer(即 setNumReduceTasks(0))

案例 2:使用默认 Reducer

在这两种情况下,我都只是将 o/p 作为

eid   1
eid 2
eid 3
ename a
ename b
ename c

最佳答案

为此,您将不得不使用 reducer 。原因是,您希望所有带有 eid 的记录都转到同一个 reducer,所有带有 ename 的记录都转到同一个 reducer。这将帮助您聚合 eidename

如果您只是使用映射器(没有缩减器),那么不同的 eid 可能会转到不同的映射器。

下面的代码实现了这一点:

package com.myorg.hadooptests;    

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;
import java.util.Iterator;

public class EidTest {

public static class EidTestMapper
extends Mapper<LongWritable, Text , Text, Text > {

public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {

String line = value.toString();
String[] words = line.split("\t");

if(words.length == 2) {
context.write(new Text("eid"), new Text(words[0]));
context.write(new Text("ename"), new Text(words[1]));
}
}
}

public static class EidTestReducer
extends Reducer<Text, Text, Text, Text> {

public void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {

String finalVal = "";

for (Text val : values) {
finalVal = finalVal.concat(val.toString()).concat(",");
}

finalVal = finalVal.substring(0, finalVal.length() - 1); // Remove trailing comma
context.write(key, new Text(finalVal));
}
}

public static void main(String[] args) throws Exception {

Configuration conf = new Configuration();

Job job = Job.getInstance(conf, "EidTest");
job.setJarByClass(WordCount.class);
job.setMapperClass(EidTestMapper.class);
job.setReducerClass(EidTestReducer.class);

job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);

FileInputFormat.addInputPath(job, new Path("/in/in9.txt"));
FileOutputFormat.setOutputPath(job, new Path("/out/"));

job.waitForCompletion(true);
}
}

对于您的输入,我得到了输出(映射器假定键/值是制表符分隔的):

eid     3,2,1
ename c,b,a

关于hadoop - 我正在尝试在 MapReduce 中输出 {key, list(values)} 但我只得到排序的 {key,value} 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34477884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com