Spark SQL内置函数
为了帮助执行复杂的分析,Spark SQL提供了一组强大而灵活的聚合函数、连接多个数据集的函数、一组内置的高性能函数和一组高级分析函数。本章将详细介绍这些主题。另外本章还介绍了Spark SQL模块的一些高级功能,并解释Catalyst优化器和Tungsten引擎所提供的优化和执行效率。
Spark SQL函数
为了有效地使用Spark SQL执行分布式数据操作,必须熟练使用Spark SQL函数。
Spark SQL提供了超过200个内置函数,它们被分组到不同的类别中。
按类别来分,SQL函数可分为四类:
- 标量函数:每一行返回单个的值。
- 聚合函数:每一组行返回单个的值。
- 窗口函数:每一组行返回多个值。
- 用户自定义函数(UDF):包括自定义的标量函数或聚合函数。
标量函数和聚合函数位于org.apache.spark.sql.functions包内。在使用前,需要先导入它:
import org.apache.spark.sql.functions._
如果是使用spark-shell或zeppelin进行交互式分析,则会自动导入该包。
内置标量函数
Spark提供了大量的标量函数,主要完成:
- 数学计算:abs、hypot、log、cbrt,等等。
- 字符串操作:length、trim、concat,等等。
- 日期操作:year、date_add,等等。
下面我们详细来了解这些函数及其用法。
日期时间函数
Spark内置的日期时间函数大致可分为以下三个类别:
- 执行日期时间格式转换的函数;
- 执行日期时间计算的函数;
- 从日期时间戳中提取特定值(如年、月、日等)的函数。
详细使用方法,请参考我的讲课视频:Spark内置的日期时间函数
字符串函数和数学计算函数
Spark SQL内置的字符串函数提供了操作字符串类型列的通用和强大的方法。一般来说,这些函数分为两类。
- 执行字符串转换的函数;
- 执行字符串提取(或替换)的函数,使用正则表达式。
最常见的字符串转换包括去空格、填充、大写转换、小写转换和字符串连接等。
Spark SQL还提供有许多对数值类型列进行计算的函数,其中最经常用到的是round函数,它对传入的列值执行一个四舍五入计算。这个函数有两种方法签名:
- def round(e: Column, scale: Int): Column
- def round(e: Column): Column
字符串函数和数学计算函数详细使用方法,请参考我的讲课视频:Spark内置字符串函数和数学计算函数
数组函数
Spark 3增加了一些新的数组函数,其中的transform和aggregate 数组函数是功能特别强大的通用函数。它们提供的功能相当于Scala中的map和fold,使ArrayType列更容易处理。
关于Spark 3中的数组函数,请参考这篇博客:Spark 3新增数组函数