Java Hadoop TextOutputFormat:向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

我正在维护一个简单的hadoop作业,它生成CSV文件作为HDFS中的输出。作业使用TextOutputFormat。 我想将前导标题行添加到csv文件中(我知道零件文件是由不同的工作人员创建的,如果每个工作人员都获得标题,这不是问题)。 如何做到这一点

编辑:级联可以,但乍一看,我不想开始使用新的框架

编辑:

因此,我想为输出CSV文件添加标题。列数 是确定性的。 这是我的减速器类的骨架:

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方法中输出标题。