将Spark DataFrame转换为Pojo对象

时间:2015-12-10 05:00:58

标签: java apache-spark apache-spark-sql

请参阅以下代码:

    //Create Spark Context
    SparkConf sparkConf = new SparkConf().setAppName("TestWithObjects").setMaster("local");
    JavaSparkContext javaSparkContext = new JavaSparkContext(sparkConf);
    //Creating RDD
    JavaRDD<Person> personsRDD = javaSparkContext.parallelize(persons);
    //Creating SQL context
    SQLContext sQLContext = new SQLContext(javaSparkContext);
    DataFrame personDataFrame = sQLContext.createDataFrame(personsRDD, Person.class);
    personDataFrame.show();
    personDataFrame.printSchema();
    personDataFrame.select("name").show();
    personDataFrame.registerTempTable("peoples");
    DataFrame result = sQLContext.sql("SELECT * FROM peoples WHERE name='test'");
    result.show();

在此之后我需要转换DataFrame - &#39;结果&#39;到人物对象或列表。提前谢谢。

2 个答案:

答案 0 :(得分:6)

DataFrame只是Dataset [Row]的类型别名。与强类型Scala / Java数据集一起提供的“类型转换”相比,这些操作也称为“无类型转换”。

从数据集[行]到数据集[人物]的转换在spark

中非常简单

DataFrame result = sQLContext.sql("SELECT * FROM peoples WHERE name='test'");

此时,Spark将您的数据转换为DataFrame = Dataset [Row],这是一个通用Row对象的集合,因为它不知道确切的类型。

// Create an Encoders for Java beans
Encoder<Person> personEncoder = Encoders.bean(Person.class); 
Dataset<Person> personDF = result.as(personEncoder);
personDF.show();

现在,Spark转换数据集[Row] - &gt;数据集[Person]特定于类型的Scala / Java JVM对象,由类Person指示。

有关详细信息,请参阅databricks提供的以下链接

https://databricks.com/blog/2016/07/14/a-tale-of-three-apache-spark-apis-rdds-dataframes-and-datasets.html

答案 1 :(得分:2)

DataFrame存储为Row,因此您可以使用the methods there to cast from untyped to typed。看看get方法。