SparkSQL(1)

本文深入探讨SparkSQL作为Spark模块在结构化数据处理中的应用,对比Hadoop生态中的多种SQL解决方案,如Hive、Impala等,分析SparkSQL的优势及架构,并指导如何在Hadoop环境中配置SparkSQL进行高效数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上节课回顾

(1)kafka的基本架构和核心概念?

(2)kafka为什么快?

(3)为什么kafka的吞吐量比较高?

(4)同一个消息能否被多个消费组消费?

(5)不同的组对topic消费,offset概念

1.基本概念

(1)定义:Spark SQL is a Spark module for structured data processing.(它是结构化数据处理的spark模块)

(2)去IOE:阿里提出的概念,本意是在阿里的IT架构中去掉IBM小型机,Orcale数据库,EMC存储设备

(3)使用SQL的前提:schema(数据库对象的集合一个用户,一般对应一个schema 该用户的schema名等于用户名,在HIVE中就是表的结构)+ file(作用的文件)

2.SQL on Hadoop

(1)定义:就是SQL语句在Hadoop上执行

(2)HIVE:有点稳定性好,开源免费,缺点就是跑的慢。

(3)Impala:和HIVE共享metastore,速度快了,但非常吃内存,用CM安装,手动安装什么吃力。

(4)shark:Spark1.0之前的,底层就是Hive,跑在Spark上,用起来较为麻烦。

(5)Dril:schemafree,无关schema,可连接的东西很多,用起来较为方便。

(6)Phoenix:因为Hbase不支持SQL查询,之后shell或者api,但俩个都比较费劲,所以phoenix就是基于Hbase上的一个SQL引擎。

(7)Spark SQL:这是Spark里面嵌套了SQL。

(8)Hive on Sprk:这是在Hive里的,Spark做为执行引擎,底层是mapreduce,2.x之后是Tez,Spark SQL支持的东西比Hive on Spark要少,因为Hive出来的比较早。

3.Spark SQL优点

(1)Seamlessly mix SQL queries with Spark programs(能无缝的将Spark和SQL连接起来)

(2)速度快,开源免费。

4.Spark SQL架构图

5.Spark操作Hive(环境搭建)

(1)将Hive的配置文件HIve-site.xml复制到spark的conf之下

(2)HIve操作SQL里面需要mysql驱动,Spark SQL则可以直接指定驱动文件

./spark-shell --master local[2] --jars /home/hadoop/software/mysqlqudong (记住一定要是jar包)

(3)./spark-sql --master local[2] --jars /sacaxxxx --driver-class-path /xjczxczxc   (这里有个坑,在sql启动的时候你的驱动,一定要在dirver这里也要加,但是shell不用)

(4)spark-sql中cache是eager的,不是core那样lazy的

(5)explain看SQL的执行计划

(6)SQL的优化,尽量先减少数据。大数据处理也是如此位次下压,无关的数据先干掉

6.IDEA与Spark SQL交互使用

(1)./start-thriftserver.sh --master local[2] --jars /home/hadoop/software/mysql-connector-java-5.1.46/mysql-connector-java-5.1.46.jar --driver-class-path /home/hadoop/software/mysql-connector-java-5.1.46/mysql-connector-java-5.1.46.jar

(2)./beeline -u jdbc:hive2://localhost:10000 -n hadoop

7.thriftserver和spark-sql或者spark-shell的区别?

(1)每次我们的shell或者sql启动都是一个application,每次启动都要重新申请资源,浪费资源但是thriftserver启动就之后就可一直放在那了。再工作中需要将他封装成一个作业,通过rest请求。。。。

import java.sql.DriverManager

/*
package SparkReview.SQL1

import java.sql.DriverManager

import com.mysql.jdbc.Driver

object SparkSQLClientApp {
  def main(args: Array[String]): Unit = {
    Class.forName("org.apache.hive.jdbc.HiveDriver")
    //Class.forName的作用,  因为在scala中的任何class或者object都是要装载在jvm虚拟机上用的
    //它就是起的这个作用返回一个类,  上面这行代码的就是返回HiveDriver类
    val conn=DriverManager.getConnection("jdbc:hive2://192.168.137.251:10000","hadoop","")
    val stmt=conn.prepareStatement("select * from dept")
    //由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。
    // 因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。所以不要使用Statement
    val rs=stmt.executeQuery() //执行这个PreparedStatement对象中的SQL语句,

    while (rs.next()){

      println(rs.getInt("deptno")+"  "+rs.getString("dname"))
    }
    rs.close()
    stmt.close()
    conn.close()

  }
}
*/
object SparkSQLClientApp{
  def main(args: Array[String]): Unit = {

    Class.forName("org.apache.hive.jdbc.HiveDriver")
    val cnon=DriverManager.getConnection("jdbc:hive2://192.168.137.251:10000","hadoop","")
    val stmt=cnon.prepareStatement("select * from dept")
    val rs=stmt.executeQuery()


    while (rs.next()){
      println(rs.getInt("deptno")+"  "+rs.getString("dname"))
//用JDBC从数据库中查询数据要用到结果集ResultSet,其中我们在获取结果的时候经常用到rs.next()方法来判断是否查询到了数据
    }

  }
}

8.作业

(1)使用自己的代码来启动thriftserver,这个代码就相当于提供一个微服务。然后客户端随便发一个请求过去,就可以把sql结果拿过来。在页面上自己展示

### Spark SQL 使用指南 #### 创建 SparkSession Spark 中的所有功能都由 `SparkSession` 类作为入口点。以下是创建一个基础的 `SparkSession` 的方法: ```scala import org.apache.spark.sql.SparkSession val spark = SparkSession .builder() .appName("Spark SQL Example") .config("spark.some.config.option", "some-value") .getOrCreate() // 隐式转换支持,例如将 RDD 转换为 DataFrame import spark.implicits._ ``` 上述代码展示了如何初始化一个 `SparkSession` 实例并配置其名称和选项[^1]。 --- #### 处理 Datasets 和 DataFrames 在 Spark SQL 中,`DataFrame` 是一种分布式的数据结构,类似于关系型数据库中的表。可以通过多种方式加载数据到 DataFrame 或 Dataset 中。以下是一个简单的例子,展示如何读取 CSV 文件并执行查询: ```scala // 加载 CSV 数据 val df = spark.read.format("csv").option("header", "true").load("path/to/csv") // 显示前几行数据 df.show() // 执行简单过滤操作 val filteredDF = df.filter($"age" > 20) // 注册临时视图以便使用 SQL 查询 filteredDF.createOrReplaceTempView("people") // 运行 SQL 查询 val result = spark.sql("SELECT * FROM people WHERE age > 30") result.show() ``` 此部分演示了如何加载外部数据源、应用过滤器以及运行 SQL 查询[^2]。 --- #### 日期时间转换 在实际场景中,经常需要对日期和时间字段进行处理。Spark SQL 提供了一系列内置函数来简化这一过程。常用的函数包括但不限于以下几个: - **to_date**: 将字符串转换为日期类型。 - **to_timestamp**: 将字符串转换为时间戳类型。 - **date_format**: 格式化日期或时间戳。 - **datediff**: 计算两个日期之间的天数差。 下面是一些具体的用法示例: ```sql -- 假设有一个名为 events 的表,其中包含 timestamp 字段 SELECT to_date(timestamp, 'yyyy-MM-dd') AS date_col, to_timestamp(timestamp, 'yyyy-MM-dd HH:mm:ss') AS ts_col, date_format(to_date(timestamp), 'MM/dd/yyyy') AS formatted_date, datediff(current_date(), to_date(timestamp)) AS days_diff FROM events; ``` 这段代码说明了如何利用 Spark SQL 函数完成常见的日期时间转换任务[^3]。 --- #### 控制输出文件数量 当写入大数据集时,默认情况下可能会生成大量小型文件。为了优化性能和管理方便,可以使用合并提示(merge hints),这使得用户能够像在 Dataset API 中那样控制输出分区的数量。具体实现如下所示: ```scala // 合并分区以减少输出文件数量 val repartitionedDF = df.repartition(10) // 设置为 10 个分区 // 写入结果到 HDFS 或其他存储系统 repartitionedDF.write.mode("overwrite").parquet("output/path") ``` 这种方法有助于提高下游系统的效率,并减少了不必要的小文件开销[^4]。 --- ### 总结 以上内容涵盖了 Spark SQL 的核心概念及其典型应用场景,包括创建 `SparkSession`、处理 Datasets/DataFrames、日期时间转换以及调整输出文件大小等方面的知识点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值