Mapper 的意外输出
Undesired output from Mapper
我试图同时处理一个数据集的四行。为此,我在映射器中使用了变量 lineCount。但是我没有正确获得部分输出。
这是我的映射器 class:-
public class GC_Mapper extends Mapper<LongWritable, Text, Text, IntWritable> {
int lineCount = 0;
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
if (lineCount % 4 == 0) {
context.write(new Text("#Reads"), new IntWritable(1));
lineCount++;
return;
}
if (lineCount % 4 == 1) {
context.write(new Text("X"), new IntWritable(1));
lineCount++;
return;
}
if (lineCount % 4 == 2) {
context.write(new Text("Y"), new IntWritable(1));
lineCount++;
return;
}
if (lineCount % 4 == 3) {
context.write(new Text("Z"), new IntWritable(1));
lineCount++;
return;
}
}
}
我的减速器:-
public class GC_Reducer extends
Reducer<Text, IntWritable, Text, DoubleWritable> {
int numReads;
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
if ((key.toString()).startsWith("#")) {
for (IntWritable read : values) {
numReads += read.get();
}
context.write(key, new DoubleWritable(numReads));
}
if ((key.toString().startsWith("X"))) {
double sum1 = 0;
for (IntWritable val : values) {
sum1 += val.get();
}
context.write(key, new DoubleWritable(sum1));
}
if ((key.toString().startsWith("Y"))) {
double sum2 = 0;
for (IntWritable val : values) {
sum2 += val.get();
}
context.write(key, new DoubleWritable(sum2));
}
if ((key.toString().startsWith("Z"))) {
double sum3 = 0;
for (IntWritable val : values) {
sum3 += val.get();
}
context.write(key, new DoubleWritable(sum3));
}
}
}
我的目的是获取读取次数(假设 4 行作为单个记录)并以不同方式处理四行。
但问题是我得到的输出是:-
#Reads 50.0
X 100.0
Y 100.0
Z 100.0
但是我想要的所有键的输出都是 50.0。只有#Reads 值是正确的。请帮我找到解决办法。提前致谢!
如果您的所有数据都是 4 行记录格式,那么使用 FileInputFormat
和 RecordReader
听起来更好。您只需要将 4 行文本文件一起发送到映射器,而不是逐行发送。
查看 this 对我关于在 hadoop 中阅读 pdf 的问题的回答。您的主要工作将依赖于您的 RecordReader
扩展 class.
的 nextKeyValue
功能
我自己得到了答案。实际上这是我的一个错误。我的映射器输出值为 IntWritable。我试图将它分配给一个 double 变量,并试图在减速器中将该值写为 DoubleWritable 。谢谢大家!
我试图同时处理一个数据集的四行。为此,我在映射器中使用了变量 lineCount。但是我没有正确获得部分输出。
这是我的映射器 class:-
public class GC_Mapper extends Mapper<LongWritable, Text, Text, IntWritable> {
int lineCount = 0;
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
if (lineCount % 4 == 0) {
context.write(new Text("#Reads"), new IntWritable(1));
lineCount++;
return;
}
if (lineCount % 4 == 1) {
context.write(new Text("X"), new IntWritable(1));
lineCount++;
return;
}
if (lineCount % 4 == 2) {
context.write(new Text("Y"), new IntWritable(1));
lineCount++;
return;
}
if (lineCount % 4 == 3) {
context.write(new Text("Z"), new IntWritable(1));
lineCount++;
return;
}
}
}
我的减速器:-
public class GC_Reducer extends
Reducer<Text, IntWritable, Text, DoubleWritable> {
int numReads;
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
if ((key.toString()).startsWith("#")) {
for (IntWritable read : values) {
numReads += read.get();
}
context.write(key, new DoubleWritable(numReads));
}
if ((key.toString().startsWith("X"))) {
double sum1 = 0;
for (IntWritable val : values) {
sum1 += val.get();
}
context.write(key, new DoubleWritable(sum1));
}
if ((key.toString().startsWith("Y"))) {
double sum2 = 0;
for (IntWritable val : values) {
sum2 += val.get();
}
context.write(key, new DoubleWritable(sum2));
}
if ((key.toString().startsWith("Z"))) {
double sum3 = 0;
for (IntWritable val : values) {
sum3 += val.get();
}
context.write(key, new DoubleWritable(sum3));
}
}
}
我的目的是获取读取次数(假设 4 行作为单个记录)并以不同方式处理四行。 但问题是我得到的输出是:-
#Reads 50.0
X 100.0
Y 100.0
Z 100.0
但是我想要的所有键的输出都是 50.0。只有#Reads 值是正确的。请帮我找到解决办法。提前致谢!
如果您的所有数据都是 4 行记录格式,那么使用 FileInputFormat
和 RecordReader
听起来更好。您只需要将 4 行文本文件一起发送到映射器,而不是逐行发送。
查看 this 对我关于在 hadoop 中阅读 pdf 的问题的回答。您的主要工作将依赖于您的 RecordReader
扩展 class.
nextKeyValue
功能
我自己得到了答案。实际上这是我的一个错误。我的映射器输出值为 IntWritable。我试图将它分配给一个 double 变量,并试图在减速器中将该值写为 DoubleWritable 。谢谢大家!