【SparkSQL】扩展 ---- DataSet 数据转换操作


目录:

一、有类型的转换算子​​   

  ​1.转换类操作 ---- flatMap、map、mapPartitions​   

  ​2.转换类操作 ---- transform​​   

  ​3.转换类操作 ---- as​​   

  ​4.过滤类操作 ---- filter​​   

  ​5.聚合类操作 ---- groupByKey​​  

   ​6.切分类操作 ---- randomSplit、sample​​  

   ​7.排序类操作 ---- orderBy、sort​​   

  ​8.去重类操作 ---- distinct、dropDuplicates​​  

   ​9.集合类操作 ---- 交集、并集、差集、limit

二、无类型的转换算子​​   

  ​1.选择 ---- select、selectExpr、select(expr())​​  

   ​2.新建列 ---- withColumn、withColumnRenamed​​   

  ​3.剪除 ---- drop​​    

 ​4.聚合 ---- groupBy


一、有类型的转换算子

1.转换类 ---- map、flatMap、mapPartitions

  • map 可以将数据集中每条数据转为另一种形式


【SparkSQL】扩展 ---- DataSet 数据转换操作_数据



  • 通过flatMap可以将一条数据转为一个数组,然后再展开这个数组放入DataSet

【SparkSQL】扩展 ---- DataSet 数据转换操作_数据_02



  • 【SparkSQL】扩展 ---- DataSet 数据转换操作_数据集_03

  • mapPartitions和map一样,但是map处理的是每条数据mapPartitions的处理单位是每个分区
  • iter是一个分区数据集合,map是将分区中的每一个元素进行转换,再生成一个新的集合

【SparkSQL】扩展 ---- DataSet 数据转换操作_数据_04


【SparkSQL】扩展 ---- DataSet 数据转换操作_返回顶部_05


返回顶部


2.转换类 ---- transform

  • map和mapPartitions以及transform都是转换,map和mapPertitions是针对数据,而transform是针对整个数据集,这种方式的最大区别就是,transform可以直接拿到DataSet进行操作
  • 【SparkSQL】扩展 ---- DataSet 数据转换操作_spark_06

  • spark.range()

【SparkSQL】扩展 ---- DataSet 数据转换操作_spark_07

返回顶部


3.转换类 ---- as

  • as[Type]算子的主要作用是将弱类型的Dataset转为强类型的Dataset,它有很多适用场景,但是最常见的还是在读取数据的时候,因为DataFrameReader体系大部分情况下是将读出来的数据转换为DataFrame的形式如果后续需要使用Dataset的强类型API,则需要将DataFrame转为Dataset.可以使用as[Type]算子完成这种操作

  • 本质上就是 DataSet[Row].as[Students] —> DataSet[Students]

返回顶部


4.过滤类 ---- filter

  • filter 按照条件过滤数据集
  • 【SparkSQL】扩展 ---- DataSet 数据转换操作_数据_08


  • 【SparkSQL】扩展 ---- DataSet 数据转换操作_数据集_09

返回顶部


5.聚合类 ---- groupByKey

  • grouByKey算子的返回结果是KeyValueGroupedDataset,而不是一个Dataset,所以必须要先经过KeyValueGroupedDataset中的方法进行聚合,再转回Dataset,才能使用Action得出结果
    其实这也印证了分组后必须聚合的道理
  • 【SparkSQL】扩展 ---- DataSet 数据转换操作_数据_10


  • 【SparkSQL】扩展 ---- DataSet 数据转换操作_数据_11

  • 返回顶部

6.切分类 ---- randomSplit、sample

  • randomSplit 会按照传入的权重随机将一个Dataset分为多个Dataset,传入randomSplit 的数组有多少个权重,最终就会生成多少个 Dataset,这些权重的加倍和应该为1,否则将被标准化
  • 【SparkSQL】扩展 ---- DataSet 数据转换操作_数据集_12


  • 【SparkSQL】扩展 ---- DataSet 数据转换操作_数据_13


  • sample 可以从一个大数据集中抽取一部分样例

【SparkSQL】扩展 ---- DataSet 数据转换操作_数据_14


  • 【SparkSQL】扩展 ---- DataSet 数据转换操作_数据集_15

返回顶部


7.排序类 ---- orderBy、sort

【SparkSQL】扩展 ---- DataSet 数据转换操作_数据集_16


【SparkSQL】扩展 ---- DataSet 数据转换操作_spark_17

返回顶部


8.去重类操作 ---- distinct、dropDuplicates
  • distinct 针对所有列去重

  • dropDuplicates 针对某一列进行去重
  • 【SparkSQL】扩展 ---- DataSet 数据转换操作_数据_18


  • 【SparkSQL】扩展 ---- DataSet 数据转换操作_数据_19

返回顶部


9.集合类操作 ---- 交集、并集、差集、limit

【SparkSQL】扩展 ---- DataSet 数据转换操作_数据集_20


【SparkSQL】扩展 ---- DataSet 数据转换操作_spark_21

返回顶部


二、无类型的转换算子

1.选择 ---- select、selectExpr、select(expr())
  • 选择操作,只可以选择具有的列
  • 在 DataSet 中,select 可以在任何位置调用
  • 使用selectExpr传入表达式参数

  • 使用expr将字符串转为逻辑执行计划 ---- 解析表达式

【SparkSQL】扩展 ---- DataSet 数据转换操作_数据集_22


  • 【SparkSQL】扩展 ---- DataSet 数据转换操作_spark_23

返回顶部


2.新建列 ---- withColumn、withColumnRenamed
  • withColumn 可以进行添加列,重命名等操作,这里的重命名是新建原有列再命名

  • withColumnRenamed 可以直接给原有列改名

【SparkSQL】扩展 ---- DataSet 数据转换操作_数据_24


  • 【SparkSQL】扩展 ---- DataSet 数据转换操作_数据集_25

返回顶部


3.剪除 ---- drop

  • drop 删除某一或某些列
  • 【SparkSQL】扩展 ---- DataSet 数据转换操作_数据_26


  • 【SparkSQL】扩展 ---- DataSet 数据转换操作_数据_27

返回顶部


4.聚合 ---- groupBy
  • groupBy 按照给定的行进行分组

为什么groupByKey是有类型的转换操作?

  • 主要原因是groupByKey所生成的对象中的算子是有类型的

为什么groupBy是无类型的转换操作?

  • 主要是因为groupBy所生成的对象中的算子是无类型的,只针对列进行处理的

【SparkSQL】扩展 ---- DataSet 数据转换操作_数据集_28


【SparkSQL】扩展 ---- DataSet 数据转换操作_spark_29

返回顶部