《零基础入门Spark》学习笔记 Day 07

数据转换

对于DataFrame之上的数据处理,Spark SQL支持两类开发入口:一类结构化查询语句:SQL;一类DataFrame开发算子,两者差不多,取决个人的开发习惯。

SQL语句

对于DataFrame,可以使用createTempView或createGlobalTempView在Spark SQL中创建临时数据表,前者创建的的临时表,生命周期限于SparkSession内部,后者可以在同一个应用程序中跨SparkSession访问。DataFrame之间的转换属于延迟计算,仅出现Action类算子时,所有之前的转换过程才会交付执行。

Spark SQL采用ANTLR语法解析器,来解析和处理SQL语句,Oracle、Presto、Hive、ES等数据仓库和计算引擎,因此,在Hive或Presto的查询语句,可以平滑地迁移到Spark SQL,而且Spark SQL提供大量内置函数,如array_distinct、collect_list,非常适合数据检索、数据分析的数据应用场景,而且学习路径短,成本低。

Spark SQL内置函数主要分为以下几类:

聚合函数

用于对一组值执行计算并返回单个值,例如:

  • count():计数
  • sum():求和
  • avg():平均值
  • max()/min():最大/最小值
  • collect_list():收集值到数组(保留重复项)
  • collect_set():收集值到数组(去重)

数学函数

用于数值计算,例如:

  • abs():绝对值
  • sqrt():平方根
  • exp()/log():指数/对数
  • sin()/cos():三角函数
  • round():四舍五入
  • rand():随机数生成

字符串函数

用于字符串操作,例如:

  • concat():字符串拼接
  • substring():截取子串
  • trim():去除空格
  • lower()/upper():大小写转换
  • regexp_extract():正则提取
  • split():按分隔符拆分

日期时间函数

用于处理日期和时间,例如:

  • current_date():当前日期
  • date_add()/date_sub():日期加减
  • year()/month()/day():提取日期部分
  • unix_timestamp():转换为Unix时间戳
  • from_unixtime():Unix时间戳转日期

条件函数

用于逻辑判断,例如:

  • coalesce():返回第一个非空值
  • ifnull()/nullif():空值处理
  • case when:条件表达式
  • greatest()/least():返回最大/最小值

窗口函数

用于分组计算,例如:

  • row_number():行号
  • rank()/dense_rank():排名
  • lead()/lag():访问前后行
  • first_value()/last_value():首尾值

DataFrame算子

DataFrame的算子分六类:RDD同源类算子、探索类算子、清洗类算子、转换类算子、分析类算子和持久化算子

一、RDD同源类算子

算子用途 算子
数据转换 map/mapPartition/flatMap/filter
数据聚合 groupByKey/reduce
数据准备 union/sample
数据预处理 repartition/coalesce
结构收集 first/take/collect

二、探索类算子

算子用途 算子
查看数据模式 columns/schema/printSchema
查看数据的"模样" show
查看数据分布 describe
查看数据的执行计划 explain

三、清洗类算子

算子 算子含义
drop 删除掉DataFrame的列数据
distinct 去重
dropDuplicates 按照指定列去重
na null值处理

四、转换类算子

算子 算子含义
select 按照列名对数据做投影
selectExpr 以SQL语句为参数生成,提取数据
where 以SQL语句为参数做数据过滤
withColumnRenamed 字段重命名
withColumn 生成新的数据列
explode 展开数组类的数据列

五、分析类算子

算子 算子含义
join 两个DataFrame之间做数据关联
groupBy 按照某些列对数据做分组
agg 分组后做数据聚合,Spark SQL支持丰富的聚合算子
sort/orderBy 按照某些列做排序

六、持久化类算子

写入模式 含义
Append 以追加的方式写入数据
Overwrite 以覆盖的方式写入数据
ErrorlfExists 如果目标存储路径已存在,则报异常
Ignore 如果目标存储路径已存在,则放弃数据写入
相关推荐
Hotchip_MEMS18 分钟前
传统咪头与MEMS硅麦:雾化器气流传感方案对比
人工智能·笔记·物联网·电脑·制造
志尊宝30 分钟前
Vue3 零基础每日笔记(040):Vite 创建 Vue3 + TS 项目——企业标配从这一篇开始
笔记·vue·html·前端开发·软件开发
水云桐程序员1 小时前
量子力学概论,量子力学概念总结
笔记·科技·学习·量子计算
darin_ฅ( ̳• ◡ • ̳)ฅ11 小时前
【 Obsidian】2026版-Obsidian安装Automatic Table of Contents 插件一键生成文章目录
笔记
2401_850122041 小时前
航空、轨交、汽车线束防护有什么不同?三大行业的共性、差异与选型逻辑
经验分享·笔记·科技
志尊宝2 小时前
Vue3 零基础每日笔记(037):动手封装 useMouse 与 useWindowSize——事件监听的标准模板
前端·javascript·vue.js·笔记·html5
有范先生2 小时前
【无标题】
笔记
三克的油2 小时前
java-学习1
java·开发语言·学习
j7~2 小时前
【C++微服务项目开发脚手架】(接口篇一)gflags + gtest + spdlog 接口学习笔记
c++·学习·gtest·项目开发·spdlog·gflags·c++项目微服务开发脚手架
hanlin032 小时前
刷题笔记:力扣第144题-二叉树的前序遍历
笔记·算法·leetcode