XY个人记
SparkSQL的函数
HIve支持的函数,SparkSQL基本都是支持的,SparkSQL支持两种自定义函数,分别是:UDF和UDAF,两种函数都是通过SparkSession的udf属性进行函数的注册使用的;SparkSQL不支持UDTF函数的 自定义使用。
☆ UDF:一条数据输入,一条数据输出,一对一的函数,即普通函数
☆ UDAF:多条数据输入,一条数据输出,多对一的函数,即聚合函数
案例一
需求:对emp表中的数据进行如下操作:按照部门id进行一个排序,排序后的每组数据给定一个从1开始的序列号
解析:可以使用row——number() 进行操作
scala> spark.sql("select deptno,empno,sal from
(select deptno,empno,sal,row_number() over (partition by deptno order by sal desc) as rnk from emp)
as tmp where tmp.rnk <=3").show
结果:
+------+-----+------+
|deptno|empno| sal|
+------+-----+------+
| 20| 7788|3000.0|
| 20| 7902|3000.0|
| 20| 7566|2975.0|
| 10| 7839|5000.0|
| 10| 7782|2450.0|
| 10| 7934|1300.0|
| 30| 7698|2850.0|
| 30| 7499|1600.0|
| 30| 7844|1500.0|
+------+-----+------+
案例二
需求:自定义四舍五入的UDF函数
package com.jeffrey.sql
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}
import scala.util.Random
/**
* 自定义UDF函数
*/
object UDFDemo {
def main(args: Array[String]): Unit = {
// 1.构建SparkSession
val warehouseLocation = "/user/hive/warehouse"
val spark = SparkSession
.builder()
.master("local")
.appName("UDF AND UDAF")
.config("spark.sql.warehouse.dir",warehouseLocation)
.enableHiveSupport()
.getOrCreate()
// 自定义函数