前言
API的spark版本为v2.2.0。参考链接pyspark.sql.functions官方文档
详解了部分常用的API及使用方法。
API介绍
pyspark.sql.functions
三角函数及数学函数
API | 作用 | 备注 |
---|
abs | 绝对值 | - |
acos | acos | - |
asin | asin | - |
atan | atan | - |
atan2 | 两个列的atan2 | - |
bitwiseNOT | 按位取反:-(n+1) | - |
bround | HALF_EVEN,如果前一位是偶数,五舍六入,否则四舍五入 | - |
cbrt | 立方根 | - |
ceil | 取不超过x的最大整数 | - |
cos | cos | - |
cosh | 双曲余弦 | - |
conv | 进制转换 | - |
degrees | 弧度转角度 | - |
exp | exp | - |
expm1 | 先求指数再减1 | - |
factorial | 阶乘 | - |
floor | 向下取整 | - |
log | log | - |
log10 | log10 | - |
log1p | 先求对数再加1 | - |
log2 | log2 | - |
pow | 求指数,第一列为底数,第二列为指数 | - |
radians | 角度转弧度 | - |
round(col,scale) | HALF_UP,同传统意义四舍五入 scale >= 0四舍五入,scale<0取整数部分 | - |
rand | [0,1]之间的iid随机数 | - |
randn | 标准正态分布采样 | - |
rint | 返回最接近的整数并转化为浮点数,0.5的话向绝对值大的方向转换 | - |
signum | 符号函数 | - |
sin | sin | - |
sinh | sinh | - |
sqrt | 平方根 | - |
tan | tan | - |
tanh | tanh | - |
agg系列
API | 作用 | 备注 |
---|
avg | df.groupBy.agg或df.agg | - |
collect_list | 与agg联合使用,将分组中的列作为list返回 | - |
collect_set | 与agg联合使用,将分组中的列作为set返回 | - |
corr | 与agg联合使用,求皮尔逊相关系数 | - |
count | 每组元素个数 | - |
countDistinct | 每组distinct元素个数 | - |
covar_pop | 两列总体协方差 | - |
covar_samp | 两列样本协方差 | - |
first | 分组第一个值 | - |
grouping | | - |
grouping_id | | - |
kurtosis | 列的峰度 | - |
last | df.groupBy(‘name’).agg(F.first(‘score’)).show() | - |
max | 最大值 | - |
mean | 均值 | - |
min | 最小值 | - |
skewness | 偏度 | - |
stddev | 样本标准偏差,同stddev_samp | - |
stddev_samp | 样本标准偏差,同stddev | - |
stddev_pop | 总体标准偏差 | - |
sum | 与agg联合使用,求和 | - |
sumDistinct | 先distinct,再求和 | - |
var_pop | 总体方差 | - |
var_samp | 样本方差 | - |
variance | 样本方差,同var_samp | - |
列编解码
API | 作用 | 备注 |
---|
ascii | 计算string列的ascii数值 | - |
bin | 二进制 | - |
hex | 十六进制 | - |
base64 | | - |
unbase64 | | - |
crc32 | 列的crc32 | - |
md5 | 列的md5 | - |
sha1 | 字符串列元素的sha1 | - |
sha2 | sha2加密,需指定位数 | - |
时间相关
API | 作用 | 备注 |
---|
date_add | 从指定天累加天数 | - |
date_sub | 从指定天减少天数 | - |
add_months | 从指定月份累加月份 | - |
current_date | 返回当前date作为一列 | - |
current_timestamp | 返回当前time作为一列 | - |
date_format | 输出时间格式 | - |
datediff | 两个日期列相隔天数 | - |
dayofmonth | 一个月的第几天 | - |
dayofyear | 一年的第几天 | - |
year | 年 | - |
weekofyear | 一年的第几个星期 | - |
month | 月份 | - |
hour | 时 | - |
minute | 分 | - |
second | 秒 | - |
last_day | 一个月最后一天 | - |
months_between | 两个时间的月份差 | - |
from_unixtime | 将以秒为时间的列转换为格式化字符串(yyyy-MM-dd HH:mm:ss) | - |
from_utc_timestamp | 带时区时间转换 | - |
next_day | 下一周的今天的日期,相当于加7 | - |
quarter | 日期处于哪个季度(1,2,3,4) | - |
trunc | 返回年或月的第一天 | - |
unix_timestamp | 转为以秒为单位的时间戳(unix) | - |
window | 时间窗口 | - |
Window function
这部分请参考我的博文:《PySpark和SQL中的Window function》
API | 作用 | 备注 |
---|
cume_dist | cume_dist | - |
dense_rank | 排序序号跳跃[(1,1),(1,1),(2,3)] | - |
rank | 排序序号不跳跃[(1,1),(1,1),(2,2)] | - |
lag | | - |
lead | | - |
ntile | | - |
percent_rank | | - |
row_number | | - |
字符串处理
API | 作用 | 备注 |
---|
initcap | 句子每个单词首字母大写 | - |
instr | 子字符串在母字符串中的位置 | - |
length | 字符串长度 | - |
locate | 字符串出现的位置 | - |
lower | 字符串全部转小写 | - |
upper | 字符串全部转大写 | - |
lpad | 指定子字符串左填充母字符串 | - |
rpad | 和lpad对应 | - |
ltrim | 删除str左边空白 | - |
rtrim | 删除str右边空白 | - |
trim | 删除str两侧空白 | - |
regexp_extract | re匹配返回匹配的元素,否则为空字符串 | - |
regexp_replace | re匹配返回最后的参数,否则为原字符串 | - |
repeat | 重复指定字符串n次 | - |
reverse | (Collection function)反转字符串或array | - |
soundex | SoundEx返回由四个字符组成的代码以评估两个字符串的相似性。 | - |
split | 分隔符可以是子字符串或者list,如果是list,每个元素都是分隔符,如[ABC] | - |
substring(str, pos, len) | 字符串截取,pos从1开始 | - |
substring_index(str, delim, count) | 先用delim对str进行分割,count可以理解为list中的slice,选取delim分割后的str中的子串 | - |
translate | 字符串替换,后两个参数对应替换 | - |
多个列操作(横向操作)
API | 作用 | 备注 |
---|
coalesce | 取非null的列,如果所有列均非null,取第一个列的值 | - |
nanvl | 取非Nan的列,如果所有列均非Nan,取第一个列的值 | - |
concat | 将多个列连接起来,适合字符串二进制和数组.注意和array区别 | - |
concat_ws | 使用指定分隔符将多个列连接起来;不可以用在groupby.agg中,会返回空值(2022.07.26) | 例子 |
hash | 列的每个元素的组合hash | - |
hypot | 两个列每个元素的欧氏距离 | - |
greatest | 指定几列对比的最大值 | - |
least | 比较多个列选取最小值 | - |
Collection function
API | 作用 | 备注 |
---|
array_contains | 如果列元素是array,判断array是否有某个元素 | - |
size | 计算array或map中的长度 | - |
sort_array | array排序 | - |
无分类常用API
API | 作用 | 备注 |
---|
isnan | 是否为nan | - |
isnull | 是否为空值null | - |
spark_partition_id | 分区编号作为一列 | - |
udf | udf | 请参考《PySpark系列:pyspark udf的使用》 |
when | F.when(df.score>=80,100).when(df.score<60,0).otherwise(50) | - |
col | 选取df列名作为参数,返回新的列 | - |
column | 同col | - |
无分类
API | 作用 | 备注 |
---|
approx_count_distinct | 去重后的值的大约个数(速度快) | - |
array | 组合多个列作为array | - |
asc | 官方没例子,Column.asc可以代替 | - |
desc | 官方没例子,Column.desc可以代替 | - |
broadcast | 将DF标记为足够小,以便在broadcast joins中使用 | - |
create_map | 两列之前的字典映射,前者为key,后者为value | - |
decode | 解码为指定字符集 | - |
encode | 编码为指定字符集 | - |
explode | 将列的list元素变为列 | - |
posexplode | 类似explode,多一个位置列 | - |
expr | 执行表达式字符串并返回column | - |
format_number | 保留几位小数 | - |
format_string | 字符串格式化(%d,%s,%f) | - |
from_json | from_json | - |
functools | 一个模块,新版已经删除 | - |
get_json_object | 从json字符串提取列 | - |
input_file_name | 为当前Spark任务的文件名创建一个字符串列。 | - |
json_tuple | 根据key解析json字符串并返回相应列 | - |
levenshtein | 两个列字符串逻辑距离 | - |
lit | 通过字面值(literal value)创建column | - |
monotonically_increasing_id | 添加单调递增的64-bit整数作为column | - |
shiftLeft | 位运算-左移 | - |
shiftRight | 位运算-右移 | - |
shiftRightUnsigned | 无符号位运算右移 | - |
struct | 组合多列作为一个struct | - |
to_date | 等价于pyspark.sql.Column.cast(“date”),将列元素转换为pyspark.sql.types.DateType类型 | - |
to_json | 将包含StructType,ArrayType或MapType的column转化为json | - |
to_timestamp | 将Column转换为pyspark.sql.types.TimestampType 类型 | - |
to_utc_timestamp | 将Column转换为带utc的时间戳类型 | - |
pyspark.sql.types
pyspark.sql.types模块提供了各种数据类型定义,用于创建DataFrame或Schema时指定列的数据类型。
常用类型
StringType
:字符串类型
IntegerType
:整数类型
LongType
:类似于IntegerType,但使用64位表示,可以存储更大的整数值。
FloatType
:单精度浮点数类型
DoubleType
:类似于FloatType,但使用双精度表示,精度更高。
DecimalType
:定点数类型,可以精确地表示小数,避免浮点数的精度问题。可以通过DecimalType(precision, scale)来指定精度和小数位数。
BooleanType
:布尔值类型,只能存储True或False。
BinaryType
:二进制数据类型,用于存储字节序列。
DateType
:日期类型,格式为yyyy-MM-dd。
TimestampType
:时间戳类型,包含日期和时间信息,格式为yyyy-MM-dd HH:mm:ss.SSS。
ArrayType
:数组类型,可以包含任意类型的元素。例如,ArrayType(StringType())表示一个字符串数组。
MapType
:映射类型,键和值都可以是任意类型。例如,MapType(StringType(),IntegerType())表示一个字符串到整数的映射。
StructType
:复合数据类型,可以包含多个字段,每个字段有自己的名称和类型。StructType的字段由StructField对象组成。
StructField
:是StructType的一个组成部分,用于定义字段的名称、类型以及是否可为空。
其他简介
IntegralType
:IntegralType是一种抽象的概念,用于描述所有整数类型(包括IntegerType和LongType)共有的特性。而IntegerType是IntegralType的一个具体实例,专门用于表示32位整数。
待整理:
‘AtomicType’,
‘ByteType’,
‘CloudPickleSerializer’,
‘DataType’,
‘DataTypeSingleton’,
‘DateConverter’,
‘DatetimeConverter’,
‘FractionalType’,
‘JavaClass’,
‘NullType’,
‘NumericType’,
‘Row’,
‘ShortType’,
‘UserDefinedType’,
代码例子
concat_ws
d1 = {'first_name':["LeBron","Stephen","Kevin"], 'last_name':["James","Curry","Durant"]}
df1 = spark.createDataFrame(pd.DataFrame(d1))
df1.show()
"""
输出:
+----------+---------+
|first_name|last_name|
+----------+---------+
| LeBron| James|
| Stephen| Curry|
| Kevin| Durant|
+----------+---------+
"""
df2 = df1.withColumn("full_name", F.concat_ws("-", F.col("first_name"), F.col("last_name")))
df2.show()
"""
输出:
+----------+---------+-------------+
|first_name|last_name| full_name|
+----------+---------+-------------+
| LeBron| James| LeBron-James|
| Stephen| Curry|Stephen-Curry|
| Kevin| Durant| Kevin-Durant|
+----------+---------+-------------+
"""