Spark综合学习笔记(二十二)SparkSQL实战4-花式查询

52 篇文章 2 订阅
8 篇文章 0 订阅

学习致谢

https://www.bilibili.com/video/BV1Xz4y1m7cv?p=59

SparkSQL花式查询

在Spark5QL模块中,将结构化数据封装到DataFrame或Dataset集合中后,提供了两种方式分析处理数据:
1、SQL编程,将DataFrame/Dataset注册为临时视图或表,编写SQL语句,类似HiveQL;
2、DSL (domain-specific language)编程,(类似于面向对象)调用DataFrame/Dataset APIl(函数),类似RDD中函数;

需求:

针对personDF中的数据使用SQL和DSL两种方式进行各种查询

代码实现:

package sql

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSession

/**
  * Author itcast
  * Desc 演示使用spark-SQL-使用SQL和DSL两种方式进行各种查询
  */
object Demo04_Query {
  def main(args: Array[String]): Unit = {
    //TODO 0.准备环境
    val spark = SparkSession.builder().appName("sparksql").master("local[*]").getOrCreate()
    val sc = spark.sparkContext
    sc.setLogLevel("WARN")

    //TODO 1.加载数据
    val lines:RDD[String]  = sc.textFile("data/SogouE.txt")

    //TODO 2.处理数据
    val personRDD:RDD[Person] = lines.map(line => {
      val arr: Array[String] = line.split(" ")
      Person(arr(0).toInt, arr(1), arr(2).toInt)
    })

    //RDD--->DF
    import spark.implicits._
    val personDF = personRDD.toDF()

    //TODO=========SQL===========
    //注册表名
//    personDF.registerTempTable("")//过期的
//    personDF.createOrReplaceGlobalTempView("")//创建全局的,SparkSession也可以用,但是生命周期太长!
      personDF.createOrReplaceTempView("t_person")//创建临时的,当前SparkSession也可以用
    //=1.查看name字段的数据
    spark.sql("select name from t_person").show()
    //=2.查看name和age字段数据
    spark.sql("select name,age from t_person").show()
    //=3.查看所有的name和age,并将age+1
    spark.sql("select name,age,age+1 from t_person").show()
    //=4.过滤age大于等于25的
    spark.sql("select name,age from t_person where age>=25").show()
    //=5.统计年龄大于30的人数
    spark.sql("select count(*)  from t_person where age>30").show()
    //=6.按年龄进行分组并统计相同年龄的人数
    spark.sql("select age,count(*)  from t_person where group by age").show()
    //=7.查询姓名=张三的
    spark.sql("select name from t_person wheree name='zhangsan'").show()
    //TODO=========DSL:面向对象的SQL===========
    //=1.查看name字段的数据
//    personDF.select(personDF.col("name"))
    personDF.select("name").show()
    //=2.查看name和age字段数据
    personDF.select("name","age").show()
    //=3.查看所有的name和age,并将age+1
//    personDF.select("name","age","age+1").show()
    //注意是$把列名转为了对象
    personDF.select($"name",$"age",$"age+1"+1).show()
    //注意是$把字符串转为了对象
    personDF.select('name,'age,'age+1).show()
    //=4.过滤age大于等于25的
    personDF.filter("age>=25").show()
    personDF.filter($"age">=25).show()
    personDF.filter('age>=25).show()
    //=5.统计年龄大于30的人数
    val count: Long = personDF.where('age>30).count()
    println("年龄大于30的人数 为:"+count)
    //=6.按年龄进行分组并统计相同年龄的人数
    personDF.groupBy('age).count().show()
    //=7.查询姓名=张三的
    personDF.filter("name='zhangsan'").show()
    personDF.filter($"name"==="zhangsan").show()
    personDF.filter('name ==="zhangsan").show()
    //TODO 3.输出数据
personDF.printSchema()
    personDF.show()

    /**
       root
       /-- id: integer (nullable = false)
       /-- namey string ( nullable = true)
       /-- age: integer ( nuLLable = false)
       +---+--------+---+
       / id/  name / age /
       +-—-+--------+---+
       / 1/ zhangsan/ 20/
       / 2/     lisi/ 29/
       / 3 /  wangwu/ 25/
       / 4/   zhaoliu/ 30/
       / 5/   tianqi/ 35/
       / 6/    kobe / 4e/
       +---+--------+---+
      */
    //TODO 4.关闭资源
  spark.close()
  }
    case class Person(id:Int,name:String,age:Int)
}

补充

在这里插入图片描述
在这里插入图片描述

运行结果

1.查看name字段的数据
在这里插入图片描述
2.查看name和age字段数据
在这里插入图片描述
3.查看所有的name和age,并将age+1
在这里插入图片描述
4.过滤age大于等于25的
在这里插入图片描述
5.统计年龄大于30的人数
在这里插入图片描述
6.按年龄进行分组并统计相同年龄的人数
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值