RDD & java 类 (反射)构建 DataFrame ---java code

import java.util.List;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SQLContext;

/**
 * 使用反射的方式将RDD转换成为DataFrame
 * 1、自定义的类必须是public
 * 2、自定义的类必须是可序列化的
 * 3、RDD转成DataFrame的时候,他会根据自定义类中的字段名进行排序。
 * @author zfg
 *
 */

public class RDD2DataFrameByReflection {

	public static void main(String[] args) {
		SparkConf conf = new SparkConf().setMaster("local").setAppName("RDD2DataFrameByReflection");
		JavaSparkContext sc = new JavaSparkContext(conf);
		SQLContext sqlcontext = new SQLContext(sc);
		
		JavaRDD<String> lines = sc.textFile("Peoples.txt");
		
		JavaRDD<Person> personsRdd = lines.map(new Function<String, Person>() {
			
			/**
			 * 
			 */
			private static final long serialVersionUID = 1L;

			@Override
			public Person call(String line) throws Exception {
				String[] split = line.split(",");
				Person p = new Person();
				p.setId(Integer.valueOf(split[0].trim()));
				p.setNam(split[1]);
				p.setAge(Integer.valueOf(split[2].trim()));
				return p;
			}
			
		});
		
		//传入进去Person.class的时候,sqlContext是通过反射的方式创建DataFrame
		//在底层通过反射的方式或得Person的所有field,结合RDD本身,就生成了DataFrame
		DataFrame df = sqlcontext.createDataFrame(personsRdd, Person.class);
	 
		//命名table的名字为person
		df.registerTempTable("personTable");
		
		
		DataFrame resultDataFrame = sqlcontext.sql("select * from personTable where age > 7");
		
		resultDataFrame.show();
		
		//将df转成rdd
		JavaRDD<Row> resultRDD = resultDataFrame.javaRDD();

		JavaRDD<Person> result = resultRDD.map(new Function<Row, Person>() {

			@Override
			public Person call(Row row) throws Exception {
				 Person p = new Person();
				 p.setAge(row.getInt(0));
				 p.setId(row.getInt(1));
				 p.setNam(row.getString(2));
				return p;
			}
		});
		
		 List<Person> personList = result.collect();
		 
		 for (Person person : personList) {
			System.out.println(person.toString());
		} 
	}
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值