spark rdd转化为dataframe

本文章通过反射的方式,把rdd转化为dataframe

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
 * @author Administrator
 *
 */
public class RDD2DataFrameReflection {

   public static void main(String[] args) {
      // 创建普通的RDD
      SparkConf conf = new SparkConf()
            .setMaster("local")  
            .setAppName("RDD2DataFrameReflection");  
      JavaSparkContext sc = new JavaSparkContext(conf);
      SQLContext sqlContext = new SQLContext(sc);
   
      JavaRDD<String> lines = sc.textFile("C://Users//Administrator//Desktop//students.txt");
      
      JavaRDD<Student> students = lines.map(new Function<String, Student>() {

         private static final long serialVersionUID = 1L;

         @Override
         public Student call(String line) throws Exception {
            String[] lineSplited = line.split(",");  
            Student stu = new Student();
            stu.setId(Integer.valueOf(lineSplited[0].trim()));  
            stu.setName(lineSplited[1]);  
            stu.setAge(Integer.valueOf(lineSplited[2].trim())); 
            return stu;
         }
         
      });
      
      // 使用反射方式,将RDD转换为DataFrame
      // 将Student.class传入进去,其实就是用反射的方式来创建DataFrame
      // 因为Student.class本身就是反射的一个应用
      // 然后底层还得通过对Student Class进行反射,来获取其中的field
      // 这里要求,JavaBean必须实现Serializable接口,是可序列化的
      DataFrame studentDF = sqlContext.createDataFrame(students, Student.class);
      
      // 拿到了一个DataFrame之后,就可以将其注册为一个临时表,然后针对其中的数据执行SQL语句
      studentDF.registerTempTable("students");  
      
      // 针对students临时表执行SQL语句,查询年龄小于等于18岁的学生,就是teenageer
      DataFrame teenagerDF = sqlContext.sql("select * from students where age<= 18");  
      
      // 将查询出来的DataFrame,再次转换为RDD
      JavaRDD<Row> teenagerRDD = teenagerDF.javaRDD();
      
      // 将RDD中的数据,进行映射,映射为Student
      JavaRDD<Student> teenagerStudentRDD = teenagerRDD.map(new Function<Row, Student>() {

         private static final long serialVersionUID = 1L;

         @Override
         public Student call(Row row) throws Exception {
            // row中的数据的顺序,可能是跟我们期望的是不一样的!
            Student stu = new Student();
            stu.setAge(row.getInt(0));
            stu.setId(row.getInt(1));
            stu.setName(row.getString(2));
            return stu;
         }
         
      });
      
      // 将数据collect回来,打印出来
      List<Student> studentList = teenagerStudentRDD.collect();
      for(Student stu : studentList) {
         System.out.println(stu);  
      }
   }
   
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值