在hdfs上将csv文件转换为另一种csv格式

时间:2015-02-02 11:12:26

标签: java csv hadoop mapreduce

我必须实现一个CSV文件转换器才能在hadoop集群上运行。主线是:

  • 我在hdfs上有一堆csv文件,包含任意内容。
  • 我知道如何在"标准中转换它们"一个(即使用指定的行)使用java代码。
  • 转换需要一些参数(大约10或15个),每个文件都有所不同。
  • 我不介意将输出文件分段。
  • 但我希望他们有一个input-filename[##].csv名称来区分它们以便以后处理/可视化。

我的问题是:最好的方法是什么?

作为hadoop的新手,我正在考虑使用map reduce这样做,但我有关于输出格式的问题。另一方面,我可以使用spark(使用我在scala中使用的java代码)。这似乎很容易编码,但后来我不知道该怎么做。

关于要实施的主要任务的指针的意见,来自(更多)有经验的用户将不胜感激。

2 个答案:

答案 0 :(得分:1)

Spark是个不错的选择。它为您提供了更快的处理灵活性。

答案 1 :(得分:0)

火花真的很简单:

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;

import org.apache.hadoop.fs.FileUtil;

import java.io.File;

public class Converter {
    static String appName = "CSV-Conversion";  // spark app name
    static String master = "local";            // spark master 

    JavaSparkContext sc;

    /**
     * Init spark context
     */
    public Converter(){
        SparkConf conf = new SparkConf().setAppName(appName).setMaster(master);
        sc = new JavaSparkContext(conf);
    }

    /**
     * The conversion using spark
     */
    public void convertFile(String inputFile, String outputDir){
        JavaRDD<String> inputRdd = sc.textFile(inputFile);
        JavaRDD<String> outputRdd = inputRdd.map(Converter::convertLine);
        outputRdd.saveAsTextFile(outputDir);
    }

    /**
     * The function that convert each file line.
     *
     * It is static (i.e. does not requires 'this') and does not use other object.
     * If external objects (or not static method) are required, they must be
     * serializable so that a copy can be send to each worker node.
     * It is however better to avoid or at least minimize such data transfer.
     */
    public static String convertLine(String line){
        return line.toUpperCase();
    }


    /**
     * As a stand-alone app
     */
    public static void main(String[] args){
        if(args.length!=2) {
            System.out.println("Invalid number of arguments. Usage: Converter inputFile outputDir");
            System.exit(1);
        }

        String inputFile = args[0];
        String outputDir = args[1];

        FileUtil.fullyDelete(new File(outputDir));

        Converter c = new Converter();
        c.convertFile(inputFile,outputDir);
    }
}

我做了simple maven project for it in github