使用spark将实体对象保留为HDFS

时间:2015-06-17 10:06:32

标签: apache-spark hdfs

我有一个人物对象,如下所示:

Person person = new Person(); person.setPersonId("10"); person.setAge(20);

我想使用Spark将其保存在HDFS中。它可以使用spark中的DataFrame类的save方法来完成,如下所示:

dataFrame.save("hdfs://localhost:9000/sample.json");

但我找不到任何方法将实体对象转换为RDDDataFrame

有没有办法将实体对象转换为RDD或DataFrame?

1 个答案:

答案 0 :(得分:3)

我建议您将Person对象转换为List。 而SparkContext可以使用" parallelize" api转换List是RDD。 RDD可以使用" saveAsObjectFile" api通过序列文件保存到hdfs。 我想你用Java编码。这是一个示例代码,如下所示。

  SparkConf sparkConf = new SparkConf().setAppName("SparkSaveToHDFS");
 JavaSparkContext ctx = new JavaSparkContext(sparkConf);

 Person Peter = new Person();
 Peter.setName("Peter");
 Peter.setAge(30);
 Person Kevin = new Person();
 Kevin.setName("Kevin");
 Kevin.setAge(40);

 List<Person> personList = new ArrayList<Person>();
 personList.add(0, Peter);
 personList.add(1,Kevin);
 System.out.println("list contains Peter : " + personList.contains(Peter) + Peter.getAge());
 System.out.println("list contains Kevin : " + personList.contains(Kevin) + Kevin.getAge());

 JavaRDD<Person> personRdd = ctx.parallelize(personList);
 personRdd.saveAsObjectFile("hdfs://hadoop-master:8020/Peter/test");     

最后使用SparkContext&#34; objectFile&#34; api将hdfs实体获取到RDD。 示例代码如下

 JavaRDD<Person> getPersonRdd = ctx.objectFile("hdfs://hadoop-master:8020/Peter/test");
    DataFrame schemaPeople = sqlContext.createDataFrame(getPersonRdd, Person.class);
    schemaPeople.registerTempTable("people");
    schemaPeople.printSchema();
    DataFrame people = sqlContext.sql("select * from people");
    people.show();