实验六:Spark Spark SQL实验

本文介绍了SparkSQL的使用方法,包括数据读取、查询操作和临时表创建,并通过实例展示了如何执行SQL语句进行数据过滤、聚合等操作。此外,还简述了SparkStreaming的基本概念及其在实时数据处理中的应用。实验过程涵盖了数据加载、DataFrame转换和SQL查询,为读者提供了深入理解SparkSQL和SparkStreaming的实践经验。

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

目录

学习目标:

学习内容:

实验环境:

基本概念:

Spark Streaming介绍:

实验步骤:

实验总结:


学习目标:

熟悉 Spark SQL 的使用方法。


学习内容:

类似于关系型数据库,SparkSQL也是语句也是由Projection(a1,a2, a3)、Data Source(tableA)、Filter(condition)组成,分别对应sql查询过 程中的Result、DataSource、Operation,也就是说SQL语句按Result-->Data Source-->Operation的次序来描述的。 执行Spark SQL语句的顺序为: 1.对读入的SQL语句进行解析(Parse),分辨出SQL语句中哪些词是关键词(如 SELECT、FROM、WHERE),哪些是表达式、哪些是Projection、哪些是Data Source 等,从而判断SQL语句是否规范; 2.将SQL语句和数据库的数据字典(列、表、视图等等)进行绑定(Bind),如 果相关的Projection、Data Source等都是存在的话,就表示这个SQL语句是可以执行 的; 3.一般的数据库会提供几个执行计划,这些计划一般都有运行统计数据,数据 库会在这些计划中选择一个最优计划(Optimize); 4.计划执行(Execute),按Operation-->Data Source-->Result的次序来进行 的,在执行过程有时候甚至不需要读取物理表就可以返回结果,比如重新运行刚运 行过的SQL语句,可能直接从数据库的缓冲池中获取返回结果


实验环境:

操作系统:Linux
开发环境:pyspark 交互式命令行

基本概念:

Spark SQL的特点:容易整合,统一的数据访问方式,兼容Hive,标准的数据连接。

Spark SQL与Hive SQL的区别:Hive SQL通过转换成MapReduce任务,然后提交到集群上执行,简化了编写MapReduce的程序的复杂性。但由于MapReduce这种计算模型执行效率比较慢,Spark SQL的应运而生。SparkSQL是一个SQL解析引擎,SQL解析成特殊RDD(DataFrame),然后在Spark集群中运行


Spark Streaming介绍:

什么是 Spark Streaming
Spark Streaming用于流式数据的处理,使得构建可扩展容错流应用程序变得容易。Spark Streaming具有易于使用、高容错性、高吞吐量等特点,它能够胜任实时的流计算,Spark Streaming 可以接收从 Socket、文件系统、Kafka、 Flume等数据源产生的数据,并对其进行实时处理。同时Spark Streaming 也能和机器学习库(MLlib)以及图计算库(Graphx)进行无缝衔接、实时在线分析。

 流数据加载:

初始化StreamingContext

from pyspark import SparkContext  #导入SparkContext包

from pyspark.streaming import StreamingContext

#导入Spark Streaming包

sc = SparkContext(master,appName)  #创建SparkContext对象

ssc = StreamingContext(sc,1)#创建DStream

#scc为DStream,可以通过type查看

type(ssc )

实验步骤:

#文件下载

wget http://10.90.45.135:8081/repository/hadoop/spark/book.txt

#输入代码

book=spark.read.text("file:///home/Desktop/book.txt")
#查看前五行

book.take(5)

#查看类型

 type(book)

 

#打印schema(表头和数据类型)

 book.printSchema()

#将book的DataFrame转换为RDD操作

 from pyspark.sql import Row
book_rdd=book.rdd.map(lambda x:x[0].split(",")).map(lambda x:Row(id=x[0],name=x[1],rating=x[2],price=x[3],publish=x[4],url=x[5]))

#创建dataFrame

 book_df=spark.createDataFrame(book_rdd)

#查询前五行数据

 book_df.show(5)

 

#打印schema

 book_df.printSchema()

 

#创建临时表

book_df.registerTempTable("tb_book")

#使用sql语句查询

spark.sql("select * from tb_book").show(15)

#模糊查询书名包含“微积分”的书

 spark.sql("select * from tb_book where name like '%微积分%'").show()

#输出图书的前10行的name和price字段信息

spark.sql("select name,price from tb_book ").show(10)

#计算所有书名包含“微积分”的评分平均值

spark.sql("select avg(rating) rating_avg from tb_book where name like '%微积
分%'")

#把书目按照评分从高到低进行排列

 spark.sql("select id,name,rating from tb_book order by rating desc").show(15)

#把图书按照出版社进行分组

 spark.sql("select publish,count(name) as cnt from tb_book group by publish order by cnt desc").show()


实验总结:

本次实验使我熟悉Spark SQL 的使用方法SparkSQL也是语句也是由Projection(a1,a2, a3)、Data Source(tableA)、Filter(condition)组成,分别对应sql查询过 程中的Result、DataSource、Operation,也就是说SQL语句按Result-->Data Source-->Operation的次序来描述的。本次学习对以后sparksql的学习奠定了基础,有利于后续学习

### 关于 Spark SQL 的普通样例类编程 以下是基于 Spark SQL 使用普通样例类进行编程的一个完整示例代码,该代码展示了如何通过定义样例类来操作 DataFrame 并完成基本的数据处理任务。 #### 定义样例类 在 Scala 中,可以通过定义样例类 (case class) 来表示数据结构。这些样例类会被用于映射输入数据并生成 DataFrame 或 Dataset[^1]。 ```scala // 定义样例类 Person 表示人员信息 case class Person(name: String, age: Int) object sparkSQLExample { def main(args: Array[String]): Unit = { // 初始化 SparkSession val spark = org.apache.spark.sql.SparkSession.builder() .appName("SparkSQL Example") .master("local[*]") .getOrCreate() import spark.implicits._ // 创建 RDD 数据集 val peopleRDD = spark.sparkContext.parallelize(Seq( "Alice,25", "Bob,30", "Charlie,35" )) // 将 RDD 转换为 DataFrame 并应用样例类 val personDF = peopleRDD.map(_.split(",")).map(attributes => Person(attributes(0), attributes(1).trim.toInt)).toDF() // 显示 DataFrame 结果 personDF.show() // 注册临时视图以便运行 SQL 查询 personDF.createOrReplaceTempView("people") // 执行 SQL 查询 val resultDF = spark.sql("SELECT name FROM people WHERE age >= 30") // 输出查询结果 resultDF.show() // 停止 SparkSession spark.stop() } } ``` 上述代码实现了以下几个功能: 1. **初始化 SparkSession**:创建了一个名为 `SparkSQL Example` 的 Spark 应用程序实例。 2. **定义样例类**:使用 `case class` 定义了 `Person` 类型,其中包含两个字段——姓名 (`name`) 和年龄 (`age`)。 3. **转换为 DataFrame**:将原始字符串形式的 RDD 数据转化为由样例类组成的 DataFrame。 4. **注册临时视图**:允许后续通过 SQL 查询访问 DataFrame 数据。 5. **执行 SQL 查询**:筛选出符合条件的结果,并展示最终输出。 此代码片段充分体现了 Spark SQL 对样例类的支持以及其强大的数据分析能力[^4]。 --- ### 实验效果说明 当运行以上代码时,预期会看到如下两部分输出: 1. **初始 DataFrame 展示** ```plaintext +-------+---+ | name|age| +-------+---+ | Alice| 25| | Bob| 30| |Charlie| 35| +-------+---+ ``` 2. **SQL 查询结果** ```plaintext +------+ | names| +------+ | Bob| |Charlie| +------+ ``` 这表明成功过滤出了所有满足条件(即年龄大于等于 30)的人名记录[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

刘新源870

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

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

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

打赏作者

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

抵扣说明:

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

余额充值