1、 Spark中的窗口函数
窗口就是单纯在行后面加一个列
可以套多个窗口函数,但彼此之间不能相互引用,是独立的
窗口函数会产生shuffle
over就是用来划分窗口的
(1) 分组聚合里面的函数,基本都可以用于窗口函数
count 、 avg 、 max 、 min
DENSE_RANK : 连续排序 11122333
RANK : 跳跃排名 11144666
(2) 窗口函数 排序和不排序的区别 :
不排序 -- 全局结果,同一个组内每一条数据后面的值都一样
排序 -- 累计, 第三条数据是第一条和第二条数据的和
(3) 凡是通过自己和自己关联的, 都是可以通过窗口实现的
sum(case when round(r/2)=zhongweishu then sco else 0 end) -- 下标等于中位数返回true,做sum(sco)求和 , 否则不求和
2、 Spark -- DF与RDD之间的相互转换
创建好 SparkSession 之后可以直接获取 SparkContext
DF比RDD多了列名和列类型
(1) RDD 转换成 DF -- studentRDD.toDF
需要注意字段的数量和顺序、 需要导入隐式转换
(2) DF 转换成 RDD -- studentDF.rdd
3、 Spark 自定义函数
所有可以写sql的框架都可以自定义函数
两种情况 : 用在DSL、 用在sql
(1) 定义自定义函数
val ageAdd: UserDefinedFunction = udf((age: Int) => {
age + 1
})
(2) DSL 可以直接调用 自定义函数
(3) 需要自定义函数, 并注册 才能在sql中使用
// 注册自定义函数
spark.udf.register("ageAdd", ageAdd)