apachesparkjavaschemardd是空的,即使它的输入rdd有数据

xzv2uavs  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(328)

嗨,我有超过40列的制表符分隔文件的大号码。我想对它应用聚合只选择几个列。我认为apachespark是最好的帮助对象,因为我的文件存储在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输出的第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。提前谢谢。

w3nuxt5m

w3nuxt5m1#

小观察:你说你的文件是用制表符分隔的,但你似乎用…分隔行。你可能想纠正它并运行?如果数据是以制表符分隔的,则sd可能没有真正的架构

a0zr77ik

a0zr77ik2#

根据spark文档,我为所有字段添加了getter/setter并实现了 Serializable 它开始工作的mypojo类的接口 JavaSchemaRDD 包含数据。

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

相关问题