Java 将Spark数据帧转换为Pojo对象
请参阅以下代码:Java 将Spark数据帧转换为Pojo对象,java,apache-spark,apache-spark-sql,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> pers
//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();
//创建Spark上下文
SparkConf SparkConf=新的SparkConf().setAppName(“TestWithObjects”).setMaster(“本地”);
JavaSparkContext JavaSparkContext=新的JavaSparkContext(sparkConf);
//创建RDD
JavaRDD personsRDD=javaSparkContext.parallelize(persons);
//创建SQL上下文
SQLContext SQLContext=新的SQLContext(javaSparkContext);
DataFrame personDataFrame=sQLContext.createDataFrame(personsRDD,Person.class);
personDataFrame.show();
personDataFrame.printSchema();
personDataFrame.select(“name”).show();
personDataFrame.RegisterEmptable(“人民”);
DataFrame result=sQLContext.sql(“从人名='test'中选择*);
result.show();
在此之后,我需要将数据帧-‘result’转换为Person对象或列表。提前感谢。一个
数据帧
存储为行
s,因此您可以使用。看看get
方法。DataFrame只是Dataset[Row]的一个类型别名。与强类型Scala/Java数据集附带的“类型化转换”不同,这些操作也被称为“非类型化转换”
在spark中,从Dataset[Row]到Dataset[Person]的转换非常简单
DataFrame result=sQLContext.sql(“从人名中选择*,其中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();
//为Java bean创建编码器
编码器personEncoder=Encoders.bean(Person.class);
数据集personDF=result.as(personEncoder);
personDF.show();
现在,Spark转换Dataset[Row]->Dataset[Person]类型特定的Scala/Java JVM对象,由类Person指定
有关更多详细信息,请参阅databricks提供的以下链接
正如这些方法所给出的,我们只能按值获取每个值,而不能作为一个整体object@DonMathew在这一点上你不会得到更好的结果。如果更容易的话,您可以转换为JSON并从那里开始。即将推出的DataSet
API应该或多或少地满足您的需求,尽管我不确定POJO现在是否不需要解码器。似乎编码器尝试设置所有类参数,而不仅仅是构造函数中的参数。例如,在上述情况下,如果我有一个类似class a{int p1 int p2 public a(int p1){this.p1=p1 this.p2=p1*2}}
int的类,编码器要求p1和p2在奇数数据帧中可用。