数据转换
对于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 | 如果目标存储路径已存在,则放弃数据写入 |