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

127 篇文章 14 订阅
17 篇文章 0 订阅

 一:准备数据源

 

 

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

       

[plain] view plain copy

print?

  1. <code class="language-java">1,zhangsan,20  
  2. 2,lisi,21  
  3. 3,wanger,19  
  4. 4,fangliu,18</code>  
 
  1. 1,zhangsan,20

  2. 2,lisi,21

  3. 3,wanger,19

  4. 4,fangliu,18

      二:实现

 

     Java版:

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

    

 
  1. package com.cxd.sql;

  2.  
  3. import java.io.Serializable;

  4.  
  5. @SuppressWarnings("serial")

  6. public class Student implements Serializable {

  7.  
  8.     String sid;

  9.     String sname;

  10.     int sage;

  11.     public String getSid() {

  12.         return sid;

  13.     }

  14.     public void setSid(String sid) {

  15.         this.sid = sid;

  16.     }

  17.     public String getSname() {

  18.         return sname;

  19.     }

  20.     public void setSname(String sname) {

  21.         this.sname = sname;

  22.     }

  23.     public int getSage() {

  24.         return sage;

  25.     }

  26.     public void setSage(int sage) {

  27.         this.sage = sage;

  28.     }

  29.     @Override

  30.     public String toString() {

  31.         return "Student [sid=" + sid + ", sname=" + sname + ", sage=" + sage + "]";

  32.     }

  33.     

  34. }

  35.  
  36.  
  37.  

         2.转换,具体代码如下

 

 

 
  1. package com.cxd.sql;

  2.  
  3. import java.util.ArrayList;

  4.  
  5. import org.apache.spark.SparkConf;

  6. import org.apache.spark.api.java.JavaRDD;

  7. import org.apache.spark.sql.Dataset;

  8. import org.apache.spark.sql.Row;

  9. import org.apache.spark.sql.RowFactory;

  10. import org.apache.spark.sql.SaveMode;

  11. import org.apache.spark.sql.SparkSession;

  12. import org.apache.spark.sql.types.DataTypes;

  13. import org.apache.spark.sql.types.StructField;

  14. import org.apache.spark.sql.types.StructType;

  15.  
  16. public class TxtToParquetDemo {

  17.  
  18.     public static void main(String[] args) {

  19.         

  20.         SparkConf conf = new SparkConf().setAppName("TxtToParquet").setMaster("local");

  21.         SparkSession spark = SparkSession.builder().config(conf).getOrCreate();

  22.  
  23.         reflectTransform(spark);//Java反射

  24.         dynamicTransform(spark);//动态转换

  25.     }

  26.     

  27.     /**

  28.      * 通过Java反射转换

  29.      * @param spark

  30.      */

  31.     private static void reflectTransform(SparkSession spark)

  32.     {

  33.         JavaRDD<String> source = spark.read().textFile("stuInfo.txt").javaRDD();

  34.         

  35.         JavaRDD<Student> rowRDD = source.map(line -> {

  36.             String parts[] = line.split(",");

  37.  
  38.             Student stu = new Student();

  39.             stu.setSid(parts[0]);

  40.             stu.setSname(parts[1]);

  41.             stu.setSage(Integer.valueOf(parts[2]));

  42.             return stu;

  43.         });

  44.         

  45.         Dataset<Row> df = spark.createDataFrame(rowRDD, Student.class);

  46.         df.select("sid", "sname", "sage").

  47.         coalesce(1).write().mode(SaveMode.Append).parquet("parquet.res");

  48.     }

  49.     /**

  50.      * 动态转换

  51.      * @param spark

  52.      */

  53.     private static void dynamicTransform(SparkSession spark)

  54.     {

  55.         JavaRDD<String> source = spark.read().textFile("stuInfo.txt").javaRDD();

  56.         

  57.         JavaRDD<Row> rowRDD = source.map( line -> {

  58.             String[] parts = line.split(",");

  59.             String sid = parts[0];

  60.             String sname = parts[1];

  61.             int sage = Integer.parseInt(parts[2]);

  62.             

  63.             return RowFactory.create(

  64.                     sid,

  65.                     sname,

  66.                     sage

  67.                     );

  68.         });

  69.         

  70.         ArrayList<StructField> fields = new ArrayList<StructField>();

  71.         StructField field = null;

  72.         field = DataTypes.createStructField("sid", DataTypes.StringType, true);

  73.         fields.add(field);

  74.         field = DataTypes.createStructField("sname", DataTypes.StringType, true);

  75.         fields.add(field);

  76.         field = DataTypes.createStructField("sage", DataTypes.IntegerType, true);

  77.         fields.add(field);

  78.         

  79.         StructType schema = DataTypes.createStructType(fields);

  80.         

  81.         Dataset<Row> df = spark.createDataFrame(rowRDD, schema);

  82.         df.coalesce(1).write().mode(SaveMode.Append).parquet("parquet.res1");

  83.         

  84.         

  85.     }

  86.     

  87. }


     scala版本:

 

    

 
  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以前的版本。

--------------------- 本文来自 黑白调92 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/u010592112/article/details/73730796?utm_source=copy

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值