【SparkSQL】扩展 ---- DataSet 数据转换操作
目录:
一、有类型的转换算子
1.转换类操作 ---- flatMap、map、mapPartitions
6.切分类操作 ---- randomSplit、sample
7.排序类操作 ---- orderBy、sort
8.去重类操作 ---- distinct、dropDuplicates
9.集合类操作 ---- 交集、并集、差集、limit
二、无类型的转换算子
1.选择 ---- select、selectExpr、select(expr())
2.新建列 ---- withColumn、withColumnRenamed
一、有类型的转换算子
1.转换类 ---- map、flatMap、mapPartitions
-
map 可以将数据集中每条数据转为另一种形式
- 通过
flatMap可以将一条数据转为一个数组,然后再展开这个数组放入DataSet
- mapPartitions和map一样,但是
map处理的是每条数据
,mapPartitions的处理单位是每个分区
- iter是一个分区数据集合,map是将分区中的每一个元素进行转换,再生成一个新的集合
返回顶部
2.转换类 ---- transform
- map和mapPartitions以及transform都是转换,map和mapPertitions是针对数据,而
transform是针对整个数据集
,这种方式的最大区别就是,transform可以直接拿到DataSet进行操作
。 - spark.range()
返回顶部
3.转换类 ---- as
-
as[Type]算子的主要作用是将弱类型的Dataset转为强类型的Dataset
,它有很多适用场景,但是最常见的还是在读取数据的时候,因为DataFrameReader体系大部分情况下是将读出来的数据转换为DataFrame的形式如果后续需要使用Dataset的强类型API,则需要将DataFrame转为Dataset
.可以使用as[Type]算子完成这种操作 - 本质上就是 DataSet[Row].as[Students] —> DataSet[Students]
返回顶部
4.过滤类 ---- filter
- filter 按照条件过滤数据集
返回顶部
5.聚合类 ---- groupByKey
- grouByKey算子的返回结果是
KeyValueGroupedDataset
,而不是一个Dataset,所以必须要先经过KeyValueGroupedDataset中的方法进行聚合,再转回Dataset,才能使用Action得出结果
其实这也印证了分组后必须聚合的道理。 - 返回顶部
6.切分类 ---- randomSplit、sample
- randomSplit 会按照传入的权重随机将一个Dataset分为多个Dataset,传入randomSplit 的数组有多少个权重,最终就会生成多少个 Dataset,这些
权重的加倍和应该为1,否则将被标准化
- sample 可以从一个大数据集中抽取一部分样例
返回顶部
7.排序类 ---- orderBy、sort
返回顶部
8.去重类操作 ---- distinct、dropDuplicates
- distinct 针对所有列去重
- dropDuplicates 针对某一列进行去重
返回顶部
9.集合类操作 ---- 交集、并集、差集、limit
返回顶部
二、无类型的转换算子
1.选择 ---- select、selectExpr、select(expr())
- 选择操作,只可以选择具有的列
- 在 DataSet 中,select 可以在任何位置调用
- 使用selectExpr传入表达式参数
- 使用expr将字符串转为逻辑执行计划 ---- 解析表达式
返回顶部
2.新建列 ---- withColumn、withColumnRenamed
- withColumn 可以进行添加列,重命名等操作,这里的重命名是新建原有列再命名
- withColumnRenamed 可以直接给原有列改名
返回顶部
3.剪除 ---- drop
- drop 删除某一或某些列
返回顶部
4.聚合 ---- groupBy
- groupBy 按照给定的行进行分组
为什么groupByKey是有类型的转换操作?
- 主要原因是groupByKey所生成的对象中的算子是有类型的
为什么groupBy是无类型的转换操作?
- 主要是因为groupBy所生成的对象中的算子是无类型的,只针对列进行处理的
-
返回顶部