本套系列博客从真实商业环境抽取案例进行总结和分享,并给出Spark商业应用实战指导,请持续关注本套博客。版权声明:本套Spark商业应用实战归做者(秦凯新)全部,禁止转载,欢迎学习。git
开窗函数与聚合函数同样,都是对行的集合组进行聚合计算。可是二者却有本质区别,待我细细给你道来,绝对让你震撼无穷。github
开窗函数用于为行定义一个窗口(这里的窗口是指运算将要操做的行的集合),它是对一组值进行操做,不须要使用 GROUP BY 子句对数据进行分组,可以在同一行中同时返回基础行的列和聚合列。极端点说:能够返回全部行的同时外带开窗聚合的列。可是 基于GROUP BY 进行聚合是不行的,由于select中不容许出现非GROUP BY 字段。sql
聚合函数则不一样:不容许同时返回全部列的同时外带聚合(sum,max 等)多行的列。json
开窗函数的调用格式为: 函数名(列) OVER(选项)函数
聚合开窗函数 OVER 关键字 : 表示把聚合函数当成聚合开窗函数而不是聚合函数。post
(1)SQL 标准容许将全部聚合函数用作聚合开窗函数。经过over()进行转换学习
sparkSession.sql("select name, class, score, count(name) over() name_count from score")
复制代码
(2)开窗函数的 OVER 关键字后括号中的可使用 PARTITION BY 子句来定义行 的分区来供进行聚合计算。经过over(partition by 列 ) 进行分组开窗,此处与 GROUP BY 子句不一样测试
sparkSession.sql("select name, class, score, count(name) over(partition by class) name_count from score").show()
复制代码
第二大类:[排序开窗函数 -> 排序函数(列) ] OVER(选项),这里的选项能够是ORDER BY 子句,也能够是OVER(PARTITION BY 子句 ORDER BY 子句),但不能够是 PARTITION BY 子句。大数据
对于排序开窗函数来说,它支持的开窗函数分别为: ROW_NUMBER(行号)、 RANK(排名)、 DENSE_RANK(密集排名)和 NTILE(分组排名)。spa
sparkSession.sql("select name, class, score, row_number() over(order by score) rank from
score").show()
复制代码
sparkSession.sql("select name, class, score, rank() over(order by score) rank from
score").show()
复制代码
sparkSession.sql("select name, class, score, dense_rank() over(order by score) rank from
score").show()
复制代码
sparkSession.sql("select name, class, score, ntile(6) over(order by score) rank from
score").show()
复制代码
字符串拼接:
spark.udf.register("concat_long_string",
(v1: Long, v2: String, split: String) => v1.toString + split + v2)
复制代码
Json抽取字段值:
spark.udf.register("get_json_object", (json: String, field: String) => {
val jsonObject = JSONObject.fromObject(json);
jsonObject.getString(field)})
复制代码
udaf全数据拼接:
spark.udf.register("group_concat_distinct", new GroupConcatDistinctUDAF())
复制代码
本节内容主要探讨了开船函数和自定义累加器的高阶高级使用案例,可能部分截图来自github公开源码,部分是个人测试案例,若有雷同某位大神私有内容,请直接留言于我,我来从新修正案例。
秦凯新 于深圳