Spark SQL操作之-函数汇总篇-下

环境说明

1. JDK 1.8
2. Spark 2.1

自定义函数分类

不同的业务需要不同的处理函数,所以spark也支持用户自定义函数来做专用的处理。这里的自定义函数分两大类:用户已定义函数(UDF)和用户自定义聚合函数(UDAF)。

用户自定义函数(UDF)

用户自定义函数比较简单,写起来就是个普通的scala函数,只不过在spark中使用的时候需要单独注册一下。
直接看例子吧。

scala> val df=Range(0,10).toSeq.toDF("id")
df: org.apache.spark.sql.DataFrame = [id: int]

scala> df.show
+---+
| id|
+---+
|  0|
|  1|
|  2|
|  3|
|  4|
|  5|
|  6|
|  7|
|  8|
|  9|
+---+

##定义一个函数,对给定的整数列都加100
scala> def add100(value:Int):Int = { value + 100 }
add100: (value: Int)Int

##注册成自定义sql函数
scala> spark.udf.register("add100", add100(_:Int))
res1: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,IntegerType,Some(List(IntegerType)))

##调用上面写的自定义函数add100(value:Int)
scala> df.selectExpr("id", "add100(id) as new_id").show
+---+------+
| id|new_id|
+---+------+
|  0|   100|
|  1|   101|
|  2|   102|
|  3|   103|
|  4|   104|
|  5|   105|
|  6|   106|
|  7|   107|
|  8|   108|
|  9|   109|
+---+------+

要注意的是,用spark.udf.register注册的函数,不能用作dataset的函数使用。需要用udf类重新注册一下。

##直接用的话,会类型不匹配的。
scala> df.select(add100($"id")).show
<console>:28: error: type mismatch;
 found   : org.apache.spark.sql.ColumnName
 required: Int
       df.select(add100($"id")).show

##正确用法,用udf注册
scala> val add100_func=udf(add100 _)
add100_func: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,IntegerType,Some(List(IntegerType)))

现在相当于有了一个add100_func的函数,类型是UserDefinedFunction
scala> df.select($"id", add100_func($"id").as("new_id")).show
+---+------+
| id|new_id|
+---+------+
|  0|   100|
|  1|   101|
|  2|   102|
|  3|   103|
|  4|   104|
|  5|   105|
|  6|   106|
|  7|   107|
|  8|   108|
|  9|   109|
| 10|   110|
| 11|   111|
| 12|   112|
| 13|   113|
+---+------+

好了,UDF就说到这,挺简单的。下面的UDAF比较起来,复杂多了。

用户自定义聚合函数(UDAF)

和UDF比起来,就多了一个A:聚合,Aggregation。其实聚合函数很常见,平时写SQL,求和啊,求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值