spark-12.sparkSQL_3_sparkSQL自定义函数

本文介绍了SparkSQL中的UDF和UDAF函数,包括弱类型和强类型UDAF的使用方法。此外,详细讲解了开窗函数的概念,如rank()和dense_rank(),并展示了如何在窗口函数中应用聚合信息和分组计算,同时提到了lag和lead函数的功能和参数含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UDF函数

通过spark.udf.register(“name”,func)来进行注册。使用select func() … 来直接调用。如:

val peopleDF = spark.read.json("examples/src/main/resources/people.json")
peopleDF.createOrReplaceTempView("people")
spark.udf.register("add",(x:String)=>"A:"+x)
spark.sql("select add(name) from people").show

UDAF函数

1、弱类型UDAF函数

  • 需要继承 UserDefinedAggregateFunction类,并复写方法。
  • 注册一个UDAF函数。
  • 使用自定以的UDAF函数。

如:

package com.dengdan.sparksql

import org.apache.spark.SparkConf
import org.apache.spark.sql.{
   Row, SparkSession}
import org.apache.spark.sql.expressions.{
   MutableAggregationBuffer, UserDefinedAggregateFunction}
import org.apache.spark.sql.types.{
   DataType, DoubleType, IntegerType, LongType, StructField, StructType}

/**
 * 自定义UDAF函数
 * 样例数据:
 * {"name":"Michael", "salary":3000}
 * {"name":"Andy", "salary":4500}
 * {"name":"Justin", "salary":3500}
 * {"name":"Berta", "salary":4000}
 * 目标:求平均工资【工资的总额,工资的个数】
 */
class AverageSal extends UserDefinedAggregateFunction {
   
  //输入数据
  override def inputSchema: StructType = StructType(StructField("salary", LongType) :: Nil)

  //每个分区中的 共享变量
  override def bufferSchema: StructType = StructType(StructField("sum", LongType) :: 
### 创建和使用自定义函数(UDF) 在 Spark SQL 中,可以通过 `UserDefinedFunction` 接口来创建 UDF 函数。这些函数可以用于执行特定的数据转换操作,尤其是在内置函数无法满足需求的情况下非常有用。 #### 导入必要的包 为了能够注册并使用 UDF 函数,首先需要导入相应的库: ```scala import org.apache.spark.sql.SparkSession import org.apache.spark.sql.functions.udf ``` #### 注册简单的 Scala/Python 函数作为 UDF 对于较为简单的情况可以直接将现有的 Scala 或 Python 方法转化为 UDF 并向 DataFrame API 或者 SQL 查询中注册该方法以便后续调用[^1]。 ##### 使用Scala: ```scala val spark = SparkSession.builder.appName("example").getOrCreate() // 定义一个普通的Scala函数 def myFunc(x: Int): String = { if (x > 0) "positive" else "non-positive" } // 将其注册为UDF val myUdf = udf(myFunc _) spark.udf.register("myCustomFunc", myFunc _) // 可选:通过名称注册到SQL上下文中 ``` ##### 使用Python: ```python from pyspark.sql import SparkSession from pyspark.sql.types import StringType spark = SparkSession.builder.appName('example').getOrCreate() # 定义一个普通的Python函数 def python_my_func(x): return 'positive' if x > 0 else 'non-positive' # 转换为UDF udf_python_my_func = udf(python_my_func, StringType()) spark.udf.register("pyMyCustomFunc", python_my_func, StringType()) # 同样可以选择性地将其命名为可查询的形式 ``` #### 应用已注册的 UDF 到DataFrame或SQL语句 一旦完成了上述步骤,则可以在 DataFrames 上应用此新创建好的 UDF ,也可以直接写成 SQL 表达式形式来进行更复杂的逻辑运算。 ```sql SELECT col_name, myCustomFunc(col_name) FROM table_name; ``` 或者是在 DataFrame 的列上直接调用已经注册过的 UDF : ```scala val dfWithNewColumn = originalDf.withColumn("new_col", myUdf($"existing_column")) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值