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新增数组函数


《Flink原理深入与编程实战》