Spark(十一)【SparkSQL的基本使用】[亲测有效]

Spark(十一)【SparkSQL的基本使用】[亲测有效]一. SparkSQL简介 Spark SQL是Spark用于结构化数据(structured data)处理的Spark模块。 Dremel > Drill(Apache) >Impala(Clo…

	Spark(十一)【SparkSQL的基本使用】[数据库教程]

一. SparkSQL简介

Spark SQL是Spark用于结构化数据(structured data)处理的Spark模块。

Dremel ——> Drill(Apache)——>Impala(Cloudrea) Presto(Hotonworks)

Hive ——-> Shark(对Hive的模仿,区别在于使用Spark进行计算)

Shark——->SparkSQL(希望拜托对Hive的依赖,兼容Hive)

SparkSQL: 如果使用SparkSQL执行Hive语句! 这种行为称为 Spark on Hive

? 如果使用Hive,执行Hive语句,但是在配置Hive时,修改了Hive的执行引擎,将执行引擎修改为了Spark! 这种行为称为Hive on Spark!

特点

  • 易整合。 在程序中既可以使用SQL,还可以使用API!
  • 统一的数据访问。 不同数据源中的数据,都可以使用SQL或DataFrameAPI进行操作,还可以进行不同数据源的Join!
  • 对Hive的无缝支持
  • 支持标准的JDBC和ODBC

二. 数据模型

DataFrame:DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。

DataSet:是DataFrame的一个扩展,类似于数据库中的表。

区别

DataSet是强类型。DataSet=DataSet[Person].

DataFrame是弱类型。DataFrame=DataSet[Row],是DataSet的一个特例。

三. SparkSQL核心编程

Spark Core:要执行应用程序,要首先构建上下文环境对象SparkContext.

SparkSQL

老的版本中,提供两种SQL查询起始点:一个叫SQLContext,用于Spark自己提供的SQL查询;一个叫HiveContext,用于连接Hive的查询。

最新的版本SparkSQL的查询入口是SparkSession。是SQLContext和HiveContext的组合,SparkSession内部封装了SparkContext

1. IDEA开发SparkSQL

pom依赖

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.12</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.12</artifactId>
        <version>3.0.0</version>
    </dependency>

2. SparkSession

创建和关闭
 import org.apache.spark.SparkConf
 import org.apache.spark.sql.SparkSession
  /**
   * 创建SparkSession
   */
  @Before
  def innit: Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("MyApp")
    val session: SparkSession = SparkSession.builder().config(conf).getOrCreate()
  }

  /**
   * 关闭SparkSession
   */
  @After
  def stop: Unit = {
    session.stop()
  }
获取SparkContext
   session.sparkContext  //获取SparkSession中的SparkContext

3. DataFrame

3.1 入门案例
  /**
   * DataFrame入门案例
   */
  @Test
  def createDF: Unit = {
    //数据格式:{"username":"zhangsan","age":20}
    //读取json格式文件创建DataFrame
    val df: DataFrame = session.read.json("input/1.txt")
    //创建临时视图:person
    df.createOrReplaceTempView("person")
    //查看person表
    df.show()
    //通过sql查询
    session.sql(
      """
        |select
        |*
        |from
        |person
        |""".stripMargin).show()
  }
3.2 显示数据
df.show()
3.3 创建DF

①读取数据源创建

session.read
csv   format   jdbc   json   load   option   options   orc   parquet   schema   table text   textFile

②通过RDD创建DataFrame

样例类??

实际开发中,一般通过样例类将RDD转换为DataFrame

先导入隐式转换包,通过rdd.toDF()方法转换

 /**
  * Person样例类
  */
 case class Person(name: String, age: Int)
  
  /**
   * 通过RDD创建DataFrame
   */
  @Test
  def creatDFByRDD {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("MyApp")
    val session: SparkSession = SparkSession.builder().config(conf).getOrCreate()
    //根据样例类创建RDD
    val rdd: RDD[(String, Int)] = session.sparkContext.makeRDD(List(("zhangsan", 12), ("lisi", 45), ("wangwu", 23)))
    val person_RDD: RDD[Person] = rdd.map {
      case (name, age) => Person(name, age)
    }
    //导入隐式包,session是上文创建的SparkSession对象
    import session.implicits._
    val df: DataFrame = person_RDD.toDF()
    //查看DF
    df.show()
    session.stop()
  }

③从hive表查询**

3.4 SQL查询语法

首先由DataFrame创建一个视图,然后用Sql语法操作

/*****************创建视图************************/
//临时视图
createOrReplaceTempView("视图名")  //不会报错
createTempView("视图名") //视图名已存在,会报错
//永久视图
df.createGlobalTempView("person")

/******************Sql查询*************************/
//临时视图:person
//查询全局视图需要添加:global_temp.person
    session.sql(
      """
        |select
        |*
        |from
        |person
        |""".stripMargin).show()

注意:普通临时表是Session范围内的,如果想应用范围内有效,可以使用全局临时表。使用全局临时表时需要全路径访问,如:global_temp.people

4. DataSet

DataSet是具有强类型的数据集合,需要提供对应的类型信息。

4.1 创建DS

样例类RDD创建

 /**
  * Person样例类
  */
 case class Person(name: String, age: Int)
 
 
  /**
   * 通过RDD创建DataFrame
   */
  @Test
  def creatDFByRDD {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("MyApp")
    val session: SparkSession = SparkSession.builder().config(conf).getOrCreate()
    //根据样例类创建RDD
    val rdd: RDD[(String, Int)] = session.sparkContext.makeRDD(List(("zhangsan", 12), ("lisi", 45), ("wangwu", 23)))
    val person_RDD: RDD[Person] = rdd.map {
      case (name, age) => Person(name, age)
    }
    //导入隐式包,session是上文创建的SparkSession对象
    import session.implicits._
    val df: Dataset[Person] = person_RDD.toDS()
    //查看DF
    df.show()
    session.stop()
  }

基本类型的序列创建DataSet

val list: Seq[Int] = List(1, 2, 3, 4)
import session.implicits._
val df1 = list.toDS()

注意:在实际使用的时候,很少用到把序列转换成DataSet,更多的是通过RDD来得到DataSet

5. RDD、DataFrame、DataSet

三者的关系

技术图片

相互转换

技术图片

总结:在对DataFrame和Dataset进行操作许多操作都需要这个包:import spark.implicits._(在创建好SparkSession对象后尽量直接导入)

Spark(十一)【SparkSQL的基本使用】

原文地址:https://www.cnblogs.com/wh984763176/p/13455059.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/6807.html

(0)
上一篇 2023-04-01
下一篇 2023-04-03

相关推荐

  • 倒转列表顺序:Python .reverse方法

    倒转列表顺序:Python .reverse方法Python是一种高级编程语言,它可以轻松地实现各种算法和数据结构。Python中的列表(List)是一种特殊的数据结构,它可以用来存储一系列有序的元素,这些元素可以是数字、字符串、对象等等。Python提供了许多方法来操作列表,其中一个非常便利的方法是.reverse(),它可以将列表的顺序反转。

    2024-02-29
    86
  • oracle删除超过一千条数据_oracle批量删除表数据

    oracle删除超过一千条数据_oracle批量删除表数据公司内做的项目是工厂内的,一般工厂内数据要求的是实时性,很久之前的数据可以自行删除处理,我们数据库用的oracle,所以就想着写一个脚本来删除,这样的话,脚本不管放在那里使用都可以达到效果 由于服务器

    2023-05-07
    177
  • redis 分布式缓存实战-redis 事务「建议收藏」

    redis 分布式缓存实战-redis 事务「建议收藏」redis 分布式缓存实战-redis 事务 1.描述 redis 事务单独的隔离操作:事务中的所有命令都会序列化、按顺序执行。事务在执行过程中,不会被其他客户端发送过来的命令请求所打断。 redis

    2023-02-14
    150
  • 在windows上用docker desktop安装StoneDB「终于解决」

    在windows上用docker desktop安装StoneDB「终于解决」自6月底开源以来,许多热心的社区用户都对StoneDB进行了编译和测试,也有一些用户询问StoneDB是否会支持Windows。虽然适配Windows版本的StoneDB尚未进入研发计划,但实际上我们

    2023-06-01
    153
  • mycat和mysql搭建高可用企业数据库集群「建议收藏」

    mycat和mysql搭建高可用企业数据库集群「建议收藏」mycat 基础 mycat 作用 当 mysql 为 1主一从的时候,mycat 支持写DB高可用,即当主挂了,那么可以写入从数据库中 将数据库看出一个蛋糕: 垂直切分,类似 上下切,水平就是 左…

    2023-04-01
    136
  • 两台服务器搭建redis集群_一个服务器搭建两个网站会有影响吗

    两台服务器搭建redis集群_一个服务器搭建两个网站会有影响吗问题描述: 今天程序那边说测试服里面有两个项目,为了数据不冲突,想一台服务器搞两个Redis实例, 然后自己这边查询了一下,确实可以这么整,只需要区分端口号和区分配置文件方面就行, 原理与nginx和

    2022-12-29
    154
  • 计算圆周率平方根的Python函数

    计算圆周率平方根的Python函数圆周率是一个常数,代表圆的周长与直径之比,通常用数学符号π来表示。圆周率是数学中的常数之一,在科学、工程等领域有着广泛的应用。

    2024-02-23
    112
  • Python字典:高效存储和快速查找数据

    Python字典:高效存储和快速查找数据Python中的字典是一种键值对(key-value)的集合,每个键(key)关联一个值(value),键必须是唯一的、不可变的,值可以是任意类型的对象。字典是可变的,可以增删改查其元素。

    2024-03-14
    74

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注