Spark中RDD转换成DataFrame的两种方式(分别用Java和scala实现)

转载:http://blog.csdn.net/u010592112/article/details/73730796 感谢原博主分享!!!


一:准备数据源

[java]  view plain  copy
  1.   

      在项目下新建一个student.txt文件,里面的内容为:

       

[plain]  view plain  copy
  1. 1,zhangsan,20  
  2. 2,lisi,21  
  3. 3,wanger,19  
  4. 4,fangliu,18  
       二:实现

     Java版:

    1.首先新建一个student的Bean对象,实现序列化和toString()方法,具体代码如下:

    

[java]  view plain  copy
  1. import java.io.Serializable;  
  2.   
  3. public class Student implements Serializable{  
  4.   
  5.     private int id;  
  6.     private String name;  
  7.     private int age;  
  8.     public int getId() {  
  9.         return id;  
  10.     }  
  11.     public void setId(int id) {  
  12.         this.id = id;  
  13.     }  
  14.     public String getName() {  
  15.         return name;  
  16.     }  
  17.     public void setName(String name) {  
  18.         this.name = name;  
  19.     }  
  20.     public int getAge() {  
  21.         return age;  
  22.     }  
  23.     public void setAge(int age) {  
  24.         this.age = age;  
  25.     }  
  26.     @Override  
  27.     public String toString() {  
  28.         return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";  
  29.     }  
  30.       
  31.       
  32.       
  33. }  
          2.转换,具体代码如下

[java]  view plain  copy
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. import org.apache.spark.api.java.JavaRDD;  
  5. import org.apache.spark.api.java.function.Function;  
  6. import org.apache.spark.sql.Dataset;  
  7. import org.apache.spark.sql.Row;  
  8. import org.apache.spark.sql.RowFactory;  
  9. import org.apache.spark.sql.SparkSession;  
  10. import org.apache.spark.sql.types.DataTypes;  
  11. import org.apache.spark.sql.types.StructField;  
  12. import org.apache.spark.sql.types.StructType;  
  13.   
  14. public class RDDToDataset {  
  15.   
  16.     public static void main(String[] args) {  
  17.         SparkSession spark=SparkSession.builder()  
  18.                    .appName("RDDToDataset")  
  19.                    .master("local[*]")  
  20.                    .getOrCreate();  
  21.         reflectCreate(spark);  
  22.         dynamicCreate(spark);  
  23.           
  24.     }  
  25.   
  26.     /** 
  27.      * 通过Java反射转换 
  28.      * @param spark 
  29.      */  
  30.     public static void reflectCreate(SparkSession spark)  
  31.     {  
  32.         JavaRDD<Student> stuRDD= spark.read().textFile("student.txt").javaRDD().map(new Function<String, Student>() {  
  33.   
  34.             public Student call(String line) throws Exception {  
  35.               
  36.                 String[] lineSplit=line.split(",");  
  37.                 Student stu=new Student();  
  38.                 stu.setId(Integer.valueOf(lineSplit[0]));  
  39.                 stu.setName(lineSplit[1]);  
  40.                 stu.setAge(Integer.valueOf(lineSplit[2]));  
  41.                 return stu;  
  42.             }  
  43.         });  
  44.           
  45.         Dataset<Row> stuDf=spark.createDataFrame(stuRDD,Student.class);  
  46.         //stuDf.select("id","name","age").write().mode(SaveMode.Append).parquet("par");  //对文件指定列名  
  47.         stuDf.printSchema();  
  48.         stuDf.createOrReplaceTempView("student");  
  49.         Dataset<Row> nameDf=spark.sql("select name from student where age<20");  
  50.         nameDf.show();  
  51.         //nameDf.write().mode("Append").text("name");//将查询结果写入一个文件  
  52.     }  
  53.     /** 
  54.      * 动态转换 
  55.      * @param spark 
  56.      */  
  57.     public static void dynamicCreate(SparkSession spark)  
  58.     {  
  59.         JavaRDD<Row> rows=spark.read().textFile("student.txt").javaRDD().map(new Function<String, Row>() {  
  60.   
  61.             public Row call(String line) throws Exception {  
  62.                   
  63.                 String[] parts=line.split(",");  
  64.                 return RowFactory.create(  
  65.                         Integer.valueOf(parts[0]),  
  66.                         parts[1],  
  67.                         Integer.valueOf(parts[2]));  
  68.             }  
  69.         });  
  70.           
  71.         //动态创建元数据  
  72.         List<StructField> fields=new ArrayList<StructField>();  
  73.         fields.add(DataTypes.createStructField("id", DataTypes.IntegerType, true));  
  74.         fields.add(DataTypes.createStructField("name", DataTypes.StringType, true));  
  75.         fields.add(DataTypes.createStructField("age", DataTypes.IntegerType, true));  
  76.         StructType schema=DataTypes.createStructType(fields);  
  77.         Dataset<Row> stuDf=spark.createDataFrame(rows, schema);  
  78.         //stuDf.select("id","name","age").write().mode(SaveMode.Append).parquet("par");  
  79.         stuDf.printSchema();  
  80.         stuDf.createOrReplaceTempView("student");  
  81.         Dataset<Row> nameDf=spark.sql("select name from student where age<20");  
  82.         nameDf.show();  
  83.         //nameDf.write().mode("Append").text("age");//将查询结果写入一个文件  
  84.     }  
  85. }  

       scala版本:

    

[plain]  view plain  copy
  1. import org.apache.spark.sql.SparkSession  
  2. import org.apache.spark.sql.types.StringType  
  3. import org.apache.spark.sql.types.StructField  
  4. import org.apache.spark.sql.types.StructType  
  5. import org.apache.spark.sql.Row  
  6. import org.apache.spark.sql.types.IntegerType  
  7.   
  8. object RDD2Dataset {  
  9.     
  10.   case class Student(id:Int,name:String,age:Int)  
  11.   def main(args:Array[String])  
  12.   {  
  13.       
  14.     val spark=SparkSession.builder().master("local").appName("RDD2Dataset").getOrCreate()  
  15.     import spark.implicits._  
  16.     reflectCreate(spark)  
  17.     dynamicCreate(spark)  
  18.   }  
  19.     
  20.  /**  
  21.      * 通过Java反射转换  
  22.      * @param spark  
  23.      */  
  24.   private def reflectCreate(spark:SparkSession):Unit={  
  25.     import spark.implicits._  
  26.     val stuRDD=spark.sparkContext.textFile("student2.txt")  
  27.     //toDF()为隐式转换  
  28.     val stuDf=stuRDD.map(_.split(",")).map(parts⇒Student(parts(0).trim.toInt,parts(1),parts(2).trim.toInt)).toDF()  
  29.     //stuDf.select("id","name","age").write.text("result") //对写入文件指定列名  
  30.     stuDf.printSchema()  
  31.     stuDf.createOrReplaceTempView("student")  
  32.     val nameDf=spark.sql("select name from student where age<20")  
  33.     //nameDf.write.text("result") //将查询结果写入一个文件  
  34.     nameDf.show()  
  35.   }  
  36.     
  37.   /**  
  38.      * 动态转换  
  39.      * @param spark  
  40.      */  
  41.   private def dynamicCreate(spark:SparkSession):Unit={  
  42.     val stuRDD=spark.sparkContext.textFile("student.txt")  
  43.     import spark.implicits._  
  44.     val schemaString="id,name,age"  
  45.     val fields=schemaString.split(",").map(fieldName => StructField(fieldName, StringType, nullable = true))  
  46.     val schema=StructType(fields)  
  47.     val rowRDD=stuRDD.map(_.split(",")).map(parts⇒Row(parts(0),parts(1),parts(2)))  
  48.     val stuDf=spark.createDataFrame(rowRDD, schema)  
  49.         stuDf.printSchema()  
  50.     val tmpView=stuDf.createOrReplaceTempView("student")  
  51.     val nameDf=spark.sql("select name from student where age<20")  
  52.     //nameDf.write.text("result") //将查询结果写入一个文件  
  53.     nameDf.show()  
  54.   }  
  55. }  
     注:1.上面代码全都已经测试通过,测试的环境为spark2.1.0,jdk1.8。

             2.此代码不适用于spark2.0以前的版本。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值