嗨,我有超过40列的制表符分隔文件。我想在它上面应用聚合只选择几列。我认为Apache Spark是最好的候选者,因为我的文件存储在Hadoop中。我有以下程序
public class MyPOJO {
int field1;
String field2; etc
}
JavaSparkContext sc;
JavaRDD<String> data = sc.textFile("path/input.csv");
JavaSQLContext sqlContext = new JavaSQLContext(sc);
JavaRDD<Record> rdd_records = sc.textFile(data).map(
new Function<String, Record>() {
public Record call(String line) throws Exception {
String[] fields = line.split(",");
MyPOJO sd = new MyPOJO(fields[0], fields[1], fields[2], fields[3]);
return sd;
}
});
当我应用动作rdd_record.saveAsTextFile("/to/hadoop/");
时,上面的代码运行正常我可以看到它创建了带有RDD输出的part-00000文件。但是当我尝试做以下事情时
JavaSchemaRDD table = sqlContext.applySchema(rdd_records, MyPojo.class);
table.printSchema(); //prints just root and empty lines
table.saveAsTextFile("/to/hadoop/path");//prints part file with [] for each line
我不知道问题在哪里MyPojo.class具有所有字段,为什么JavaSchemaRDD为空并且在部分文件中不打印任何内容。请指导我是Spark新手。提前谢谢。
答案 0 :(得分:0)
次要观察:你说你的文件是制表符分隔的,但是你似乎在使用分割线,....你可能想要纠正它并运行?如果您的数据以制表符分隔,则sd可能没有真正的架构
答案 1 :(得分:0)
当我为所有字段添加getter / setter并为MyPojo类实现Serializable
接口时,它开始工作且JavaSchemaRDD
包含数据时,编码Spark documentation。
public class MyPOJO implements Serializable {
private int field1;
private String field2;
public int getField1() {
returns field1;
}
public void setField1(int field1) {
this.field1 = field1;
}
public String getField2() {
return field2;
}
public void setField1(String field2) {
this.field2 = field2;
}
}