Spark Sql之两种方式构建DataFrame


一、通过定义类的方式指定schema来构建DataFrame

object GenerateDFByClass{
  def main(args: Array[String]): Unit = {
    //1.创建配置对象
    val conf = new SparkConf()
        .setAppName("generateDF") //指定应用名
        .setMaster("local[2]")    //指定为本地模式运行
    //2.创建SqlContext
    val sc = new SparkContext(conf);
    val sqlContext = new SQLContext(sc);

    //3.从文件系统中加载数据,生成rdd
    //val fileRdd = sc.textFile("hdfs://hadoop01:9000/stu.txt").map(_.split(" "))
    val fileRdd = sc.textFile("F:/stu.txt").map(_.split(" "))

    //4.将RDD和case class关联
    val stuRdd = fileRdd.map(line => Stu(line(0).toInt,line(1),line(2).toInt))

    //5.导入隐式转换,如果不到人无法将RDD转换成DataFrame
    //将RDD转换成DataFrame
    import sqlContext.implicits._
    val stuDF = stuRdd.toDF

    //6.注册一张临时表
    stuDF.registerTempTable("student");

    //7.用sql语句查询分数最高的前三位
    val resDF = sqlContext.sql("select * from student order by score desc limit 3")

    //8.打印结果到控制台
    resDF.show()

    //9.将结果保存mysql数据库中
    val prop = new Properties()
    prop.setProperty("user","root")
    prop.setProperty("password","root")
    //将查询的数据追加到student表中
    resDF.write.mode(SaveMode.Append).jdbc(
      "jdbc:mysql://localhost:3306/db1",
      "student",
      prop
    )

    sc.stop()
  }
}
//定义一个学生类,用于作为将rdd转化DataFrame时的映射
case class Stu(sid:Int,sname:String,score:Int)

二、通过StructType指定schema构建DataFrame

object GenerateDFByStructType{
  def main(args: Array[String]): Unit = {
    //1.创建配置对象
    val conf = new SparkConf().setAppName("generateDF2").setMaster("local[2]")

    //2.创建集群入口类对象
    val sc = new SparkContext(conf)

    //3.创建SqlContext对象
    val sqlContext = new SQLContext(sc)

    //4.读取本地文件系统的文件,生成rdd
    val dataRdd = sc.textFile("F:/stu.txt").map(_.split(" "))

    //5.通过StructType构建schema约束
    val schema = StructType(
      List(
        StructField("sid",IntegerType,false),
        StructField("sname",StringType,true),
        StructField("score",IntegerType,true)
      )
    )

    //6.//将RDD映射到rowRDD
    val rowRdd = dataRdd.map(s => Row(s(0).toInt,s(1),s(2).toInt))

    //7.将rdd转化为DataFrame
    val resDF = sqlContext.createDataFrame(rowRdd,schema)

    //8.打印结果
    resDF.show();

    //9.以json格式保存结果数据
    resDF.write.mode(SaveMode.Append).json("F:/res")
    sc.stop()
  }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bokzmm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值