2026-02-27 01:04:41
Spark SQL和Hive中的函数(五):SparkSQL函数算子
Spark SQL提供了丰富的函数算子,这些算子可以在DataFrame/DataSet的算子中调用,主要参考DataFrame/DataSet的算子以及org.apache.spark.sql.functions._下的函数。以下是对SparkSQL函数算子的详细介绍:
一、SparkSQL函数算子概述SparkSQL函数算子允许用户在DataFrame或DataSet的转换过程中应用各种函数,这些函数可以用于数据清洗、转换、聚合等多种操作。与直接在SQL中应用的函数不同,这些算子是通过编程方式调用的,提供了更大的灵活性和控制力。
二、常用SparkSQL函数算子字符串函数算子
concat: 连接多个字符串列。
substring: 截取字符串的一部分。
upper/lower: 将字符串转换为大写或小写。
trim: 去除字符串两端的空格。
示例代码:
import org.apache.spark.sql.functions._val df = spark.table("some_table")val result = df.withColumn("concatenated", concat(col("col1"), lit(" "), col("col2"))) .withColumn("upper_col", upper(col("col3")))数学函数算子
abs: 计算绝对值。
round: 四舍五入到指定小数位。
sqrt: 计算平方根。
pow: 计算幂。
示例代码:
val result = df.withColumn("abs_value", abs(col("numeric_col"))) .withColumn("rounded", round(col("double_col"), 2))日期和时间函数算子
current_date: 获取当前日期。
current_timestamp: 获取当前时间戳。
date_add: 日期加法。
date_sub: 日期减法。
datediff: 计算两个日期之间的天数差。
示例代码:
val result = df.withColumn("today", current_date()) .withColumn("tomorrow", date_add(col("date_col"), 1))聚合函数算子
sum: 计算总和。
avg: 计算平均值。
count: 计算行数。
max/min: 计算最大值或最小值。
示例代码(通常在groupBy后使用):
val aggregated = df.groupBy("category") .agg(sum("value").alias("total"), avg("value").alias("average"))条件函数算子
when/otherwise: 类似于SQL中的CASE WHEN语句。
coalesce: 返回第一个非空的参数。
示例代码:
val result = df.withColumn("status", when(col("score") > 90, lit("A")) .when(col("score") > 80, lit("B")) .otherwise(lit("C")))窗口函数算子
Spark SQL支持窗口函数,这些函数可以在DataFrame API中使用window函数结合其他聚合函数来实现。
示例代码:
import org.apache.spark.sql.expressions.Windowval windowSpec = Window.partitionBy("department").orderBy("salary").rowsBetween(-1, 1)val result = df.withColumn("avg_salary", avg("salary").over(windowSpec))UDF(用户定义函数)
用户可以定义自己的函数并在DataFrame API中使用。
示例代码:
val myUDF = udf((s: String) => s.length * 2)val result = df.withColumn("doubled_length", myUDF(col("string_col")))SparkSQL函数算子提供了丰富的功能,允许用户在DataFrame或DataSet的转换过程中灵活地应用各种函数。这些算子不仅包括了基本的字符串、数学、日期和时间函数,还包括了聚合、条件和窗口函数等高级功能。此外,用户还可以通过定义UDF来扩展Spark SQL的功能。通过合理使用这些函数算子,可以大大提高数据处理的效率和灵活性。