第一种:
逐行执行,SQL就是调用select,然后在select中传函数(UFD输入一行返回一行),对于RDD,就是调用底层new MapPartitionsRDD,不论是SQL还是RDD都不需要shuffle
第二种:
分组执行:
select gender, avg(age), count(*) from tb_student group by gender
SQL就是调用Select,必须要求Select的字段要么在聚合函数里面SUM(meney),要么在group by之后,有几个组就返回几行。如果是RDD,调用reduceByKey,可以进行局部聚合的就先在分区内局部聚合,然后在全局聚合,如果不能局部聚合和,就先分组,然后在运算
特殊情况:select avg(age), count(*) from tb_student,RDD调用的是reduce(这种特殊情况就是把整个表当成一个组)
第三种:
划分窗口
select 多个字段,窗口函数() Over(Parition By 字段) from 表,注意没有group By
会划分出很多的窗口,一个窗口中有多少行数据就输出多少行数据
RDD:先分组,然后调用flatMapValues,(排序可选)输入的迭代器进行处理,要返回一个迭代器或集合
RDD:先分区,(排序可选)然后mapPartitions,对数据进行处理,必须要返回一个迭代器