Apache Spark JavaSchemaRDD为空,即使输入RDD具有数据

时间:2015-05-06 16:26:48

标签: hadoop apache-spark

嗨,我有超过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新手。提前谢谢。

2 个答案:

答案 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;
    }
    }