内置函数(org.apache.spark.sql.funtions.scala)
一、常用内置函数:
1.聚合函数
approx_count_distinct/countDistinct: 计算某一列或几列不同元素的个数
avg: 平均数, count: 个数;
first: 首个元素, last:最后一个元素;
max/min, mean, sum, sumDistinct
var_pop: 总体方差, var_samp/variance 计算样本方差; stddev_pop, stddev_samp: 标准差
covar_pop, covar_samp 协方差,.corr 相关系数
kurtosis: 峰度; .skewness:偏度
2.集合函数
array_contains: 包含某个元素
array_distinct: 删除重复的元素
array_except 返回一个array 在第一个col 不在第二个col的元素
array_intersect(col1, col2) 交集4
array_max, array_min, array_position(col, value):第一次出现value的位置,从1开始
array_remove(col, element) 删除出现的元素
array_repeat(col, count): 创造一个数组,count为重复的个数
array_sort(col): 对数组进行排序
array_union(col1, col2), 合并操作
array_overlap, 判断是否有重叠
array_zip, 合并,类似于python的zip
reverse: 逆序; shuffle: 打乱; size, slice, sort_array
3.日期/时间函数
日期时间转换
unix_timestamp, from_unixtime, to_date, quarter, day, dayofyear, weekofyear, from_utc_timestamp, to_utc_timestamp
从日期时间中提取字段
year, month, dayofmonth, hour, minute, second
日期/时间计算
datediff, date_add, date_sub, add_months, last_day, next_day, months_between
获取当前时间等
current_date, current_timestamp, trunc, date_format
4.数学函数
abs, acros, asin, atan, atan2, bin, cbrt, ceil, conv, cos, sosh, exp, expm1, factorial, floor, hex, hypot, log, log10, log1p, log2, pmod, pow, rint, round, shiftLeft, shiftRight, shiftRightUnsigned, signum, sin, sinh, sqrt, tan, tanh, toDegrees, toRadians, unhex
5.混合函数
array, bitwiseNOT, callUDF, coalesce, crc32, greatest, if, inputFileName, isNaN, isnotnull, isnull, least, lit, md5, monotonicallyIncreasingId, nanvl, negate, not, rand, randn, sha, sha1, sparkPartitionId, struct, when
6.字符串函数
字符串分割,大小写转化,删除首尾空白, 正则表达式匹配
ltrim, rtrim, trim
ascii, base64, unbase64, decode, encode, format_string
repeat, reverse
instr(str, substr): 第一次出现的位置; locate(substr, str, pos=1)
字符拼接:concat, concat_ws
分割,子串: split, substring, substring_index
isnan, isnull, nanvl(col1, col2): 返回col1, 如果col1不为nan, 否则返回col2
lower, upper
7.窗口函数
cumeDist, denseRank, lag, lead, ntile, percentRank, rank, rowNumber
作用:分组,对一个组执行函数,这里面最常用的函数是rowNumber,我们可以用它来分组取topN
二、内置函数的使用
案例一:
object InnerFunctionDemo {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().appName("InnerFunctionDemo").master("local[*]").getOrCreate()
import spark.implicits._
val sc = spark.sparkContext
//模拟用户访问日志信息
val accessLog = Array(
"2016-12-27,001",
"2016-12-27,001",
"2016-12-27,002",
"2016-12-28,003",
"2016-12-28,004",
"2016-12-28,002",
"2016-12-28,002",
"2016-12-28,001"
)
//定义DataFrame的结构
val schema = StructType(Array(
StructField("day", StringType),
StructField("userId", IntegerType, true)