【极简spark教程】spark常用内置函数

开始使用:

spark有丰富的内置函数,可以通过functions导入

import org.apache.spark.sql.functions._

1. 聚合函数

聚合函数一般在agg方法中使用:groupBy(colName).agg([聚合函数])

avg:平均
collect_list:聚合指定字段的值到list
collect_set:聚合指定字段的值到set
corr:计算两列的Pearson相关系数
count:计数
countDistinct:去重计数 SQL中用法
covar_pop:总体协方差(population covariance)
covar_samp:样本协方差(sample covariance)
first:分组第一个元素
last:分组最后一个元素
grouping:grouping_id
kurtosis: 计算峰态(kurtosis)值
skewness: 计算偏度(skewness)
max:最大值
min:最小值
mean:平均值
stddev: 即stddev_samp
stddev_samp: 样本标准偏差(sample standard deviation)
stddev_pop:总体标准偏差(population standard deviation)
sum:求和
sumDistinct:非重复值求和 SQL中用法
var_pop:总体方差(population variance)
var_samp:样本无偏方差(unbiased variance)
variance:即var_samp

2. 集合函数

简单理解,集合函数可以在Array(数组类型)和set(集合类型)上使用

取值:如果一列为array类型,可以直接使用(0)来进行取值
array_contains(column,value):检查array类型字段是否包含指定元素
array_position(column,value):返回array类型字段中第一个指定元素的索引,如果为0则表示无此元素
explode: 展开array或map为多行
explode_outer:同explode,但当array或map为空或null时,会展开为null。
posexplode:同explode,带位置索引。
posexplode_outer:同explode_outer,带位置索引。
from_json:解析JSON字符串为StructType or ArrayType,有多种参数形式,详见文档。
to_json:转为json字符串,支持StructType, ArrayType of StructTypes, a MapType or ArrayType of MapTypes。
get_json_object(column,path):获取指定json路径的json对象字符串。
json_tuple(column,fields):获取json中指定字段值。
map_keys:返回map的键组成的array
map_values:返回map的值组成的array
size:array or map的长度,需要结合withColumn使用
sort_array(e: Column, asc: Boolean):将array中元素排序(自然排序),默认asc。

3. 时间函数

对时间进行处理

add_months(startDate: Column, numMonths: Int):指定日期添加n月
date_add(start: Column, days: Int):指定日期之后n天 e.g. select date_add('2018-01-01',3)
date_sub(start: Column, days: Int):指定日期之前n天
datediff(end: Column, start: Column):两日期间隔天数
current_date():当前日期
current_timestamp():当前时间戳,TimestampType类型
date_format(dateExpr: Column, format: String):日期格式化
dayofmonth(e: Column):日期在一月中的天数,支持 date/timestamp/string
dayofyear(e: Column):日期在一年中的天数, 支持 date/timestamp/string
weekofyear(e: Column):日期在一年中的周数, 支持 date/timestamp/string
from_unixtime(ut: Column, f: String):时间戳转字符串格式
from_utc_timestamp(ts: Column, tz: String):时间戳转指定时区时间戳
to_utc_timestamp(ts: Column, tz: String):指定时区时间戳转UTF时间戳
hour(e: Column):提取小时值
minute(e: Column):提取分钟值
month(e: Column):提取月份值
quarter(e: Column):提取季度
second(e: Column):提取秒
year(e: Column):提取年
last_day(e: Column):指定日期的月末日期
months_between(date1: Column, date2: Column):计算两日期差几个月
next_day(date: Column, dayOfWeek: String):计算指定日期之后的下一个周一、二...,dayOfWeek区分大小写,只接受 "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"。
to_date(e: Column, format:String):字段类型转为DateType
		(1) to_date只负责解析字符串,但是不能进行格式转换,例如to_date(lit("20200101"), "yyyyMMdd")可以运行,但是to_date(lit("20200101"), "yyyy-MM-dd")报错
		(2) date_format只负责格式转换,但是不能进行类型转化,例如date_format(to_date("20200101","yyyyMMdd"), "yyyy-MM-dd"),date_format(lit("20200101"),"yyyyMMdd")返回null
trunc(date: Column, format: String):日期截断
unix_timestamp(s: Column, p: String):指定格式的时间字符串转时间戳
unix_timestamp(s: Column):同上,默认格式为 yyyy-MM-dd HH:mm:ss
unix_timestamp():当前时间戳(),底层实现为unix_timestamp(current_timestamp(), yyyy-MM-dd HH:mm:ss)
window(timeColumn: Column, windowDuration: String, slideDuration: String, startTime: String) 时间窗口函数,将指定时间(TimestampType)划分到窗口

4. 数学函数

常用数学函数,如sin、cos、tan等

sinh,tanh,cosh:计算角度的余弦,正弦,反正弦
acos,asin,atan,atan2:计算双曲正弦,正切,反正切
bin:计算余弦/正弦值对应的角度,将long类型转为对应二进制数值的字符串For example, bin("12") returns "1100".
bround:舍入,使用Decimal的HALF_EVEN模式,v>0.5向上舍入,v< 0.5向下舍入,v0.5向最近的偶数舍入。
round(e: Column, scale: Int):HALF_UP模式舍入到scale为小数点。v>=0.5向上舍入,v< 0.5向下舍入,即四舍五入。
ceil:向上舍入
floor:向下舍入
conv(num:Column, fromBase: Int, toBase: Int): 转换数值(字符串)的进制
log(base: Double, a: Column):$log_{base}(a)$
log(a: Column):$log_e(a)$
log10(a: Column):$log_{10}(a)$
log2(a: Column):$log_{2}(a)$
log1p(a: Column):$log_{e}(a+1)$
pmod(dividend: Column, divisor: Column):Returns the positive value of dividend mod divisor.
pow(l: Double, r: Column):$r^l$ 注意r是列
pow(l: Column, r: Double):$r^l$ 注意l是列
pow(l: Column, r: Column):$r^l$ 注意r,l都是列
radians(e: Column):角度转弧度
rint(e: Column):Returns the double value that is closest in value to the argument and is equal to a mathematical integer.
shiftLeft(e: Column, numBits: Int):向左位移
shiftRight(e: Column, numBits: Int):向右位移
shiftRightUnsigned(e: Column, numBits: Int):向右位移(无符号位)
signum(e: Column):返回数值正负符号
sqrt(e: Column):平方根
hex(column: Column):转十六进制
unhex(column: Column):逆转十六进制

5. 混杂(misc)函数

常用于数据加密与校验

crc32(e: Column):计算CRC32,返回bigint
hash(cols: Column*):计算 hash code,返回int
md5(e: Column):计算MD5摘要,返回32位,16进制字符串
sha1(e: Column):计算SHA-1摘要,返回40位,16进制字符串
sha2(e: Column, numBits: Int):计算SHA-1摘要,返回numBits位,16进制字符串。numBits支持224, 256, 384, or 512.

6. 其他非聚合函数

abs(e: Column):绝对值
array(cols: Column*):多列合并为array,cols必须为同类型
map(cols: Column*):将多列组织为map,输入列必须为(key,value)形式,各列的key/value分别为同一类型。
bitwiseNOT(e: Column):Computes bitwise NOT.
broadcast[T](df: Dataset[T]): Dataset[T]:将df变量广播,用于实现broadcast join。如left.join(broadcast(right), "joinKey")
coalesce(e: Column*):返回第一个非空值
col(colkong'zhime: String):返回colName对应的Column
column(colName: String):col函数的别名
expr(expr: String):解析expr表达式,将返回值存于Column,并返回这个Column。
greatest(exprs: Column*):返回多列中的最大值,跳过Null
least(exprs: Column*):、返回多列中的最小值,跳过Null
input_file_name():返回当前任务的文件名 ??
isnan(e: Column):检查是否NaN(非数值)
isnull(e: Column):检查是否为Null
lit(literal: Any):将字面量(literal)创建一个Column
typedLit[T](literal: T)(implicit arg0: scala.reflect.api.JavaUniverse.TypeTag[T]):将字面量(literal)创建一个Column,literal支持 scala types e.g.: List, Seq and Map.
monotonically_increasing_id():返回单调递增唯一ID,但不同分区的ID不连续。ID为64位整型。
nanvl(col1: Column, col2: Column):col1为NaN则返回col2
negate(e: Column):负数,同df.select( -df("amount") )
not(e: Column):取反,同df.filter( !df("isActive") )
spark_partition_id():返回partition ID
struct(cols: Column*):多列组合成新的struct column

7. 生成随机数

rand(seed: Long):随机数[0.0, 1.0],使用seed种子
randn():随机数,从正态分布取
randn(seed: Long):同上

8. 行转列

行转列相当于mysql中的case when else

when(condition: Column, value: Any):当condition为true返回value
// 举个例子:
people.select(when(people("gender") === "male", 0)
.when(people("gender") === "female", 1)
.otherwise(2))
// 如果没有otherwise且condition全部没命中,则返回null.

9. 自定义函数UDF

spark.udf.register(udfName: String, [匿名函数]):定义UDF
callUDF(udfName: String, cols: Column*):调用UDF
// 举个例子:
import org.apache.spark.sql._
// 记住toDF这种简单好用的创建DataFrame的方法
val df = Seq(("id1", 1), ("id2", 4), ("id3", 5)).toDF("id", "value")
spark.udf.register("simpleUDF", (v: Int) => v * v)
df.select($"id", callUDF("simpleUDF", $"value"))
  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼摆摆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值