一、引言在上一篇博客中我们深入学习了Spark Core与RDD。RDD的强大在于其极高的灵活性——它允许我们用函数式编程处理任何类型的数据。但是随着大数据分析逐渐走向业务化我们面对的数据80%以上都是结构化的例如数据库中的表、CSV文件、JSON日志。此时RDD的劣势显现了出来缺乏数据结构信息SchemaSpark框架本身不知道RDD内部元素的类型结构无法进行底层优化。开发门槛高对于数据分析师来说写SQL远比写Scala/Python函数要方便。为了解决这些问题Spark SQL应运而生。它不仅提供了更友好的编程接口DataFrame/DataSet还内置了一个强大的Catalyst 优化器能将SQL语句自动优化执行效率甚至远超手写的RDD代码。今天我们就来彻底掌握Spark SQL。二、核心概念DataFrame与Dataset2.1 什么是DataFrame与RDD类似DataFrame也是一个分布式的数据容器。但不同的是DataFrame 带有 Schema表结构信息。它更像传统数据库中的一张二维表格不仅有数据还记录了每一列的名称和类型。RDD 与 DataFrame 的区别RDD[Person]Spark 知道里面装的是 Person 对象但不知道 Person 内部有什么属性。DataFrameSpark 清晰地知道这张表包含nameString类型和ageInt类型两列。有了 SchemaSpark SQL 就可以像关系型数据库那样进行列裁剪、谓词下推等高级优化。2.2 两种编程风格Spark SQL 支持两种编程风格SQL 风格将 DataFrame 注册为临时视图直接书写标准 SQL。DSL 风格Table API调用 DataFrame 提供的 API如select,where,groupBy进行链式编程。三、Spark SQL 编程实战3.1 环境准备与 DataFrame 创建在 Spark 2.0 之后SparkSession取代了SparkContext成为新的入口。from pyspark.sql import SparkSession if __name__ __main__: # 1. 创建 SparkSession spark SparkSession.builder \ .master(local[*]) \ .appName(SparkSQL_Basic) \ .getOrCreate() # 2. 读取 JSON 文件生成 DataFrame (JSON自带Schema) df spark.read.json(rD:\data\students.json) # 3. 打印表结构 (Schema) df.printSchema() # 4. 展示数据 (默认显示20行) df.show() spark.stop()3.2 SQL 风格与 DSL 风格结合给定的数据我们来演示如何用两种方式查询数据。数据准备 (student.csv)id,name,kill,country 1,张三,10,A国 2,李四,13,A国 3,王五,83,B国 4,赵六,32,B国 5,孙七,33,C国代码演示# ----------------- 方式一SQL 风格 ----------------- # 注册临时视图 df.createOrReplaceTempView(students) # 写 SQL 查询 sql_df spark.sql( SELECT country, COUNT(1) as num, MAX(kill) as max_kill FROM students GROUP BY country ) sql_df.show() # ----------------- 方式二DSL 风格 ----------------- # 使用 API 链式调用 import pyspark.sql.functions as F dsl_df df.select(country, kill) \ .where(df.kill 10) \ .groupBy(country) \ .agg(F.count(kill).alias(num), F.max(kill).alias(max_kill)) dsl_df.show()3.3 复杂实战窗口函数与行列转换Spark SQL 完全兼容 Hive 的窗口函数和复杂类型操作。结合a.txtWordCount和x2.txt多列拆分、分组TopN我们来看 DSL 的强大之处。案例一WordCount (爆炸函数)df_lines spark.read.text(a.txt) # 使用 split 和 explode 进行行转列扁平化 word_df df_lines.select( F.explode(F.split(value, )).alias(word) ) # 分组统计 word_count word_df.groupBy(word).count().orderBy(F.desc(count)) word_count.show()案例二分组TopN (窗口函数)需求求出每个国家杀敌数排行前三的英雄。from pyspark.sql.window import Window # 定义窗口按国家分区按杀敌数降序 window_spec Window.partitionBy(country).orderBy(F.desc(kill)) # 添加排名列 df_rank df.withColumn(rnk, F.row_number().over(window_spec)) # 过滤出排名小于等于3的 top3_df df_rank.where(df_rank.rnk 3).drop(rnk) top3_df.show()四、RDD 与 DataFrame 的相互转换在复杂的业务场景中经常需要结合 RDD 的灵活性如非结构化清洗和 DataFrame 的结构化查询优势。4.1 RDD 转 DataFrame有两种方式反射机制和自定义 Schema。rdd spark.sparkContext.textFile(person.txt) rdd2 rdd.map(lambda v: v.split( )).map(lambda v: (v[0], int(v[1]))) # 方式一toDF (直接指定列名) df rdd2.toDF([name, age]) # 方式二通过 StructType 自定义 Schema适合复杂结构 from pyspark.sql.types import StructType, StructField, StringType, IntegerType schema StructType([ StructField(name, StringType(), True), StructField(age, IntegerType(), True) ]) df2 spark.createDataFrame(rdd2, schema)4.2 DataFrame 转 RDD直接调用.rdd属性。此时返回的 RDD 每一行是一个Row对象可以通过row[列名]访问。五、自定义函数UDF当内置函数无法满足需求时我们可以注册 Python 函数作为 UDFUser Defined Function。# 定义一个将 1/2 转为 男/女 的函数 def convert_sex(sex): return 男 if sex 1 else 女 # 注册 UDF 到 SparkSession spark.udf.register(to_sex, convert_sex, StringType()) # 1. 在 SQL 中使用 spark.sql(select name, to_sex(sex) as sex from t_user).show() # 2. 在 DSL 中使用 df.select(name, convert_sex(df.sex).alias(sex)).show()六、数据的加载与保存 (Load / Save)Spark SQL 支持极其丰富的数据源包括 Parquet、JSON、CSV、MySQL 等。6.1 通用模式与 SaveMode在写入数据时需要特别注意SaveMode保存模式SaveMode说明errorifexists默认文件存在则报错append追加写入overwrite覆盖原有数据ignore忽略不报错也不写入6.2 读写 Parquet (企业级首选)Parquet 是一种列式存储格式自带 Schema 且压缩率极高是大数据数仓的绝对主流。# 写入采用覆盖模式 df.write.mode(overwrite).parquet(output/parquet_data) # 读取 spark.read.parquet(output/parquet_data).show()6.3 读写 JDBC (MySQL)注意坑点在使用 Python 的 Spark SQL 连接 MySQL 时必须将mysql-connector-java-x.x.x.jar驱动包放入pyspark/jars目录下。url jdbc:mysql://192.168.100.110:3306/test props { user: root, password: 123456, driver: com.mysql.cj.jdbc.Driver } # 写入 MySQL df.write.jdbc(urlurl, tabledf_user, modeoverwrite, propertiesprops) # 从 MySQL 读取 spark.read.jdbc(urlurl, tabledf_user, propertiesprops).show()七、Spark 与 Hive 的深度整合在企业数仓中底层数据通常存储在 Hive 中。为了让 Spark 能直接读取 Hive 元数据我们需要整合两者。7.1 Spark on Hive vs Hive on SparkSpark on Hive使用 Spark 引擎执行 SQL但数据/元数据来自于 Hive。这是目前的主流用法。Hive on Spark将 Hive 的底层计算引擎从 MR 替换为 Spark作为 Hive 的一个优化手段。7.2 整合步骤配置环境将 Hive 的hive-site.xml拷贝到 Spark 的conf目录下。拷贝驱动将 MySQL 驱动包mysql-connector-java-x.x.x.jar拷贝到 Spark 的jars目录。启动 Hive 元数据服务hive --service metastore metastore.log 21 测试整合可以通过spark-sql命令行或 Python 代码。Python 代码读取 Hive 表from pyspark.sql import SparkSession if __name__ __main__: spark (SparkSession.builder .master(local[*]) .appName(SparkOnHive) # 指向 Hive Metastore 服务地址 .config(hive.metastore.uris, thrift://master:9083) # 开启 Hive 支持 .enableHiveSupport() .getOrCreate()) # 直接查询 Hive 中的表 spark.sql(select * from user1).show() spark.stop()八、总结Spark SQL 让大数据的处理回归到了最自然、最易用的“二维表”模型。核心模块关键内容核心抽象DataFrame带 Schema 的分布式数据、Dataset编程风格SQL 风格易用、DSL 风格灵活、易组合数据类型转换RDD 与 DataFrame 互转Schema 是关键高级特性自定义函数UDF、窗口函数分组TopN、行列转换explode数据源支持 Parquet、JSON、CSV、MySQL生态整合Spark on Hive复用元数据无缝对接数仓
企业数字化 ERP 产品动态
相关推荐
不懂安全库存,别说你懂物料管理! 做物料管理,最头疼的事是什么?不是仓库里没货,而是仓库明明压着几百万库存,生产线却还在天天催料。采购觉得备货不少,生产却总是缺关键物料,财务还在催着降低库存资金占用。问题往往不在库存总量࿰… · 2026/11/13 9:20:59
行业数据怎么找清楚 亿欧数据与商业情报的实用理解 在企业研究、行业分析、市场进入和竞争判断这些具体工作里,很多人真正卡住的地方,并不是不会分析,而是不知道从哪里拿到足够可靠的行业数据,也不知道怎样把分散的信息整理成能用的商业情报。
这个问题看起来像是信息搜索问题&… · 2026/11/12 6:22:21
IBA主席乌马尔·克里姆廖夫:2026年杜尚别亚洲大奖赛如何改变国际双陆棋 描述:来自30个国家的300多名参赛者、12个竞赛项目、50万美元奖金——解析IBA主席兼IBF负责人乌马尔克里姆廖夫如何将国际双陆棋提升至世界体育水平。
不久之前,国际双陆棋还像是一种“圈内人”的游戏:人们在童年接触它,在别墅、咖… · 2026/11/6 20:47:43
清远市电工证考试安排多久拿证?学历不高也能报考 清远市电工证考试安排多久拿证?学历不高也能报考 你是不是担心自己学历不高,报不了清远市电工证考试?别急,今天就给你讲清楚, 清远市电工证考试安排 到底怎么走, 多久拿证 ,以及哪些人真的能报上名,还能顺利拿证。… · 2026/11/13 9:20:32
陕西外架工特种操作证怎么考?郑州报考避坑指南全解析 陕西外架工特种操作证怎么考?郑州报考避坑指南全解析 你是不是也遇到过这种情况?拿着手机翻遍了网上各种培训机构,结果越看越懵,不知道到底哪家靠谱,怕被中介坑,更怕花了钱还拿不到证?现在,咱们就来聊聊【陕西外架工特种操作证】到底是怎么考的,怎么… · 2026/11/13 9:20:32
线上报名考试电工证报考条件与考试时间 电工证线上报名考试多少钱?新手怕被中介坑怎么办 你是不是也担心不知道去哪里报名电工证,怕被中介坑?现在很多人对线上报名考试电工证的流程和价格都不太清楚,生怕多花冤枉钱还考不到证。别急,这篇文章就帮你把线上线下报名的流程、价格、避坑技巧都讲明… · 2026/11/13 9:20:32
虎林哪里考电工证最快,含金量高不高值得考吗 虎林哪里考电工证最快,含金量高不高值得考吗 工地太忙根本没时间复习考试,这几乎是每个一线工友的真实写照,尤其是在虎林地区,工期紧、任务重,很多电工师傅连抽时间准备考试都成问题。但别小看这个电工证,它的 含金量… · 2026/11/13 9:20:32
初次考电工证的条件你知道多少?全国通用的电工证怎么考 初次考电工证的条件你知道多少?全国通用的电工证怎么考 你是不是正在找工作,却发现手里没有电工证,连面试资格都没?别急,这篇文章就是为你准备的。初次考电工证的条件其实并不难,但很多人因为信息不对称而错过了机会,现在就来教你一招搞定。… · 2026/11/13 9:20:32
电工证实操考试怕挂科?泰兴市报考电工证全流程详解+多少钱 电工证实操考试怕挂科?泰兴市报考电工证全流程详解+多少钱 实操考试心里没底怕挂科?你不是一个人在战斗,很多在泰兴市准备报考电工证的同学,尤其是像我这样的许昌应届工程类毕业生,都曾因为不知道流程、材料准备不全或者选错培训机构,导致考试频频受阻… · 2026/11/13 9:19:30
电工证丢失还能补吗?千万别踩坑,丢了证等于失业 电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/12 14:09:01
电力电缆作业证直播报名入口与办理流程良心建议 电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/13 5:40:45
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/12 23:27:43
维修电公用考电工证吗 在哪考最靠谱 维修电公用考电工证吗 在哪考最靠谱 工地太忙根本没时间复习考试,你是维修电工,天天在项目上跑,连抽个空背个题都难。那问题来了—— 维修电公用考电工证吗 ?答案是: 必须考 。尤其是在当前施工行业,没有电工证,连进场都可能被拦下。而且,… · 2026/11/13 0:00:08
电工证是不是可以登高?含金量和证书范围你必须知道的事 电工证是不是可以登高?含金量和证书范围你必须知道的事 证书过期了不知道怎么复审延期,这事儿很多人遇到过,尤其是像你这样在郑州金水区做劳务班组负责人,手里握着几十个工人的证书,稍微一疏忽,就可能影响工程进度和公司信誉。特别是电工证是不是可以登… · 2026/11/13 0:00:08
鸡西电工证哪家下证快官方报名入口怎么找 鸡西电工证哪家下证快官方报名入口怎么找 你是不是也担心 学历不高怕报不上名 ?别急,今天我就来跟你说说, 鸡西电工证哪家下证快 ,还有 官方报名入口 到底怎么找,别让那些“代办”“代考”耽误了你的机会。… · 2026/11/13 0:00:08
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 6:12:21
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 6:11:51
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/12 21:15:21