Java Hadoop TextOutputFormat:向CSV输出添加标题
我正在维护一个简单的hadoop作业,它生成CSV文件作为HDFS中的输出。作业使用TextOutputFormat。 我想将前导标题行添加到csv文件中(我知道零件文件是由不同的工作人员创建的,如果每个工作人员都获得标题,这不是问题)。 如何做到这一点 编辑:级联可以,但乍一看,我不想开始使用新的框架 编辑: 因此,我想为输出CSV文件添加标题。列数 是确定性的。 这是我的减速器类的骨架:Java Hadoop TextOutputFormat:向CSV输出添加标题,java,csv,hadoop,mapreduce,Java,Csv,Hadoop,Mapreduce,我正在维护一个简单的hadoop作业,它生成CSV文件作为HDFS中的输出。作业使用TextOutputFormat。 我想将前导标题行添加到csv文件中(我知道零件文件是由不同的工作人员创建的,如果每个工作人员都获得标题,这不是问题)。 如何做到这一点 编辑:级联可以,但乍一看,我不想开始使用新的框架 编辑: 因此,我想为输出CSV文件添加标题。列数 是确定性的。 这是我的减速器类的骨架: import java.io.IOException; import org.apache.hadoo
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;
public final class Reducer extends Reducer<Text, IntWritable, Text, IntWritable>
{
private MultipleOutputs<Text, IntWritable> mos;
private static final Text KEY_HOLDER = new Text();
private static final IntWritable VALUE_HOLDER = new IntWritable(1);
@Override
public void setup(final Context context)
{
mos = new MultipleOutputs<Text, IntWritable>(context);
}
@Override
public void cleanup(final Context context) throws IOException, InterruptedException
{
mos.close();
}
@Override
public void reduce(final Text key, final Iterable<IntWritable> values, final Context context)
throws IOException, InterruptedException
{
// [... some business logic ...]
mos.write(KEY_HOLDER, VALUE_HOLDER, "myFileName");
context.progress();
}
}
import java.io.IOException;
导入org.apache.hadoop.io.IntWritable;
导入org.apache.hadoop.io.Text;
导入org.apache.hadoop.mapreduce.Reducer;
导入org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;
公共最终类Reducer扩展了Reducer
{
私人多路输出mos;
私有静态最终文本密钥_HOLDER=新文本();
私有静态最终可写入值\u HOLDER=新的可写入(1);
@凌驾
公共无效设置(最终上下文)
{
mos=新的多输出(上下文);
}
@凌驾
公共无效清除(最终上下文)引发IOException、InterruptedException
{
mos.close();
}
@凌驾
public void reduce(最终文本键、最终Iterable值、最终上下文)
抛出IOException、InterruptedException
{
//[…一些业务逻辑…]
mos.write(密钥持有者,值持有者,“myFileName”);
context.progress();
}
}
您可以覆盖mapper/reducer类中的run(),以便根据需要添加标题。例如,如果您想在最终o/p中添加FirstName和LastName,可以使用以下代码作为参考
public void run(Context context) throws IOException, InterruptedException
{
setup(context);
column = new Text("ColumnName") ;
values = new Text("FirstName" + "\t" + "LastName") ;
context.write(column, values);
try
{
while (context.nextKey())
{
reduce(context.getCurrentKey(), context.getValues(), context);
Iterator<IntWritable> iter = context.getValues().iterator();
if(iter instanceof ReduceContext.ValueIterator)
{ ((ReduceContext.ValueIterator<IntWritable>)iter).resetBackupStore();
}
}
}
finally
{
cleanup(context);
}
}
公共void运行(上下文上下文)抛出IOException、InterruptedException
{
设置(上下文);
column=新文本(“ColumnName”);
值=新文本(“FirstName”+“\t”+“LastName”);
context.write(列、值);
尝试
{
while(context.nextKey())
{
reduce(context.getCurrentKey(),context.getValues(),context);
迭代器iter=context.getValues().Iterator();
if(iter instanceof ReduceContext.ValueIterator)
{((ReduceContext.ValueIterator)iter).resetBackupStore();
}
}
}
最后
{
清理(上下文);
}
}
为什么要投否决票?如果这个问题没有意义,请告诉我。你能在你的地图或缩小器中添加标题吗?您可以在实际数据之前输出标题。请显示一些代码,根据您的描述,我们无法在这方面为您提供帮助。@zsxwing映射程序接收一行,还原程序接收一个元组和一些数值。。。它们如何在“这是第一行,添加标题…”的上下文中运行?您可以在setup方法中输出标题。