我必须实现一个CSV文件转换器才能在hadoop集群上运行。主线是:
input-filename[##].csv
名称来区分它们以便以后处理/可视化。我的问题是:最好的方法是什么?
作为hadoop的新手,我正在考虑使用map reduce这样做,但我有关于输出格式的问题。另一方面,我可以使用spark(使用我在scala中使用的java代码)。这似乎很容易编码,但后来我不知道该怎么做。
关于要实施的主要任务的指针的意见,来自(更多)有经验的用户将不胜感激。
答案 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);
}
}