sparksql 函数大全


数学函数

函数 简介 用法
acosh 反双曲余弦值 SELECT acosh(0.5);0.9624236501192069 SELECT acosh(3.5);1.9248473002384139
asinh 反双曲正弦 SELECT asinh(1.45);1.1667043308708802
atan2 弧度为单位的角度 SELECT atan2(6, 3);1.1071487177940904
atanh 反双曲正切 select atanh(0.54);0.6041556029622672
cosh 双曲余弦 select cosh(1.34);2.040444586973331
cot 余切 select cot(134);-0.5235533086264333
kurtosis 计算峰度值 select kurtosis(id) from data;-0.9354760165570974
count_min_sketch count-min草图,是一种概率数据结构,用于使用次线性空间进行基数估计 https://zhuanlan.zhihu.com/p/369981005
expm1 e的N次方-1 select expm1(1);1.718281828459045
sinh 双曲正弦 select sinh(12.34);114330.97602621827
tanh 双曲正切 select tanh(0.34);0.32747739480870536
skewness 两个列的偏移量 SELECT skewness(id) from data;4.364357804719847
hypot aa+bb=c*c 三角形三边原理,给两边求第三边 select hypot(3,4);5
randn 返回随机数 带负数 SELECT randn(0);1.6034991609278433
random 返回随机数 0-1 select random();0.8284189156403218
rint 返回参数值的最接近的数学整数的双精度数 select rint(1.5324);2.0
log1p 参数+1 log(e) SELECT log1p(1.718281828459045);1

组函数

函数 简介 用法
mean 平均值 SELECT mean(user_id) from data;26
posexplode_outer 带下标的explode SELECT posexplode_outer(array(10,20));0 10,1 20 SELECT posexplode_outer(map(10,20));0 10 20
cube 立方体group by 按照 group by(id,user_id,(id,user_id),null) select id,user_id,count(1) from data group by cube(id,user_id);
explode_outer 数组展开 没有看出来和explode的区别 注释写的是不同,但是实际相同 select explode_outer(array(1,2,null));1,2,NULL
first 第一个值 select first(id) from data;1
grouping_id 分组的ID select grouping_id(),id,user_id,count(1) from data group by cube(id,user_id); 类似hive的grouping__id
last 最后一个值 select last(id) from data;5
max_by 按照第二个参数的最大值,取对应第一个参数值 SELECT max_by(id, user_id) from data;1
min_by 按照第二个参数的最小值,取对应第一个参数值 SELECT min_by(id, user_id) from data;4
rollup group by所有列,必须包含第一列 union group by null select id,user_id,count(1) from data group by rollup(id,user_id);
spark_partition_id 返回partitionid select spark_partition_id() from data limit 100; 我这结果全是0

统计函数

函数 简介 用法
approx_count_distinct 近似去重统计,速度快很多1/3 1000万 select approx_count_distinct(id,double(34.999)) from data; 7779436
approx_percentile 近似的百分比,速度快很多 SELECT approx_percentile(id, array(0.5, 0.4, 0.1)) from data; [4999694,3999009,1000000]
bit_and 返回所有数值的按位AND select bit_and(id) from data;5
bit_count 按位计数,没有做预聚合,使用过程中崩了 select bit_count(id) from data;
bit_length 字节长度 select bit_length(‘abcd’);32
bit_or 返回所有数值的按位OR select bit_or(id) from data;7
bit_xor 返回所有数值的按位异或 相同为0 不同为1 select bit_or(id) from data;1

基本类型转换函数

函数 简介 用法
typeof 返回数据类型 select typeof(1.45);decimal(3,2) select typeof(2);int
bigint 强转为整数 select bigint(3.12);3
boolean 强转为boolean 函数写的还可以哈 select boolean(‘true’);true select boolean(‘TruE’);true select boolean(”);NULL
decimal 强转为数字类型 不能限定小数位转成整数 很奇怪 select decimal(5.12); 5
double 强转为双浮点类型 select double(‘5.12’);5.12
float 参数为浮点类型 select float(‘3.12’);3.12
smallint 强转为整数类型 select smallint(‘10000’);10000
string 强转为字符串类型 select string(15.45);15.45
tinyint 强转为整数类型 select tinyint(’15’);15
int 强转为整数类型 select int(1.56);1

日期函数

函数 简介 用法
timestamp 强转为时间戳类型 select timestamp(1661575380);2022-08-27 12:43:00
date 强转为日期 yyyy-MM-dd格式 select date(‘2022-08-08’);2022-08-08
date_part 日期截取 year month week doy(day_year) days(day_month) hour minutes seconds SELECT date_part(‘YEAR’, now());2022
date_trunc 类似于hive的floor函数 日期的floor SELECT date_trunc(‘YEAR’, ‘2015-03-05T09:32:05.359’);2015-01-01 00:00:00
dayofyear 一年中当前天数 这个函数hive还真没有 SELECT dayofyear(‘2022-08-08’);220
extract 日期截取 date_part类似 year month week doy(day_year) days(day_month) hour minutes seconds SELECT extract(‘days’, now());27
make_date 输入参数转日期 SELECT make_date(‘2013’, ‘7’, ’15’);2013-07-15
make_interval years,months,weeks,days,hours,mins,secs SELECT make_interval(2022,08,11,12,12,30,01.001001);2022 years 8 months 89 days 12 hours 30 minutes 1.001001 seconds
make_timestamp year,month,day,hour,min,sec[, timezone] SELECT make_timestamp(2022,08,11,12,12,30);2022-08-11 12:12:30
now 返回现在时间 SELECT now();2022-08-27 12:52:30.356
weekday 返回周的天数 select weekday(‘2022-08-26’);4
to_timestamp 字符串转日期格式 SELECT to_timestamp(‘20161231’, ‘yyyyMMdd’);2016-12-31 00:00:00

集合函数

Array相关函数
函数 简介 用法
aggregate 数组、函数的初始值、函数表达式 SELECT aggregate(array(1, 2, 3), 0, (x,y)->x+y);6
array_distinct 数组内去重 select array_distinct(collect_list(id)) from data;[1,2,3,4,5]
array_except 数组内去除 select array_except(col,col) from (select collect_list(id) col from data); []
array_intersect 数组内inner join select array_intersect(col,col) from (select collect_list(id) col from data); [1,2,3,4,5]
array_join 数组每个元素进行字符串拼接 第三个参数替换NULL SELECT array_join(array(‘a’, null ,’c’), ‘
array_max 数组内最大值 select array_max(col) from (select collect_list(id) col from data);
array_min 数组内最小值 select array_min(col) from (select collect_list(id) col from data);
array_position 元素在数组中的位置 数组、元素(可以是列) select array_position((select collect_list(id) col from data),id) from data ;1,2,3,4,5
array_remove 数组移除当前元素,数组不共享 select array_remove((select collect_list(id) col from data),id) from data ;[2,3,4,5],[1,3,4,5],[1,2,4,5],[1,2,3,5],[1,2,3,4]
array_repeat 把元素重复当作数组返回 select array_repeat(’12’,5);[“12″,”12″,”12″,”12″,”12”]
array_sort 数组排序 SELECT array_sort(array(‘3’, ‘2’, ‘1’), (x, y) -> case when xy then 1 end);[“1″,”2″,”3”]
array_union union操作元素去重 SELECT array_union(array(1, 2, 3), array(1, 3, 5));[1,2,3,5]
arrays_overlap inner join && count(1) ,只包含null返回null SELECT arrays_overlap(array(1,2), array(1));true
arrays_zip 带数组下标的zip SELECT arrays_zip(array(4), array(7,8));[{“0″:4,”1”:7},{“0″:null,”1”:8}]
cardinality 数组长度 SELECT cardinality(array(‘b’, ‘d’, ‘c’, ‘a’));4
forall 数组内元素都执行这个操作,结果符合预期返回true SELECT forall(array(1, 2, 3), x -> x % 2 == 0);false
element_at 元素在集合中查找 select element_at((select collect_list(id) col from data),int(id)) from data ;
filter 过滤 SELECT filter(array(1, 2, 3), x -> x % 2 == 1);[1,3]
slice 数组切数组 SELECT slice(array(1, 2, 3, 4), 2, 5);[2,3,4]
transform 数组元素map SELECT transform(array(1, 2, 3), x -> x + 1);[2,3,4]
flatten 数组内部还是数组的展开 不去重 SELECT flatten(array(array(1, 2), array(1, 4)));[1,2,1,4]
sequence 返回数组 仅支持整数和时间类型 SELECT sequence(6,9);[6,7,8,9] SELECT sequence(6,0);[6,5,4,3,2,1,0]
shuffle 给数组随机排序 SELECT shuffle(array(1, 20, 3, 5));[1,5,3,20]
inline_outer 数组内部还是struct的展开 不去重 SELECT inline_outer(array(struct(1, ‘a’), struct(1, ‘a’)));
zip_with 数组压缩 SELECT zip_with(array(1, 2), array(3, 4), (x, y) -> x + y);[4,6]
map相关函数
函数 简介 用法
map_concat map内部还是map的展开 重复报错 SELECT map_concat(map(1, ‘a’, 2, ‘b’), map(3, ‘c’));{1:”a”,2:”b”,3:”c”}
map_entries map转成数组+内部key方式 SELECT map_entries(map(1, ‘a’, 2, ‘b’));[{“key”:1,”value”:”a”},{“key”:2,”value”:”b”}]
map_filter map过滤 SELECT map_filter(map(1, ‘a’, 2, ‘b’),(k,y)->(k>=1));{1:”a”,2:”b”}
map_from_arrays map转数组方式 SELECT map_from_arrays(array(1.0, 3.0), array(‘2’, ‘4’));{1.0:”2″,3.0:”4″}
map_from_entries array转map SELECT map_from_entries(array((1, ‘a’), (2, ‘b’)));{1:”a”,2:”b”}
map_zip_with 按照给定方式压缩map SELECT map_zip_with(map(1, ‘a’, 2, ‘b’), map(1, ‘x’, 2, ‘y’), (k, v1, v2) -> concat(v1, v2));{1:”ax”,2:”by”}
transform_keys 对map的key进行函数操作 SELECT transform_keys(map(‘a’,1,’b’,2),(k,v)->v+1); {2:1,3:2}
transform_values 对map的value进行函数操作 SELECT transform_values(map(‘a’,1,’b’,2),(k,v)->v+1); {“a”:2,”b”:3}
集合转文件相关函数
函数 简介 用法
from_csv 按照csv格式解析字符串 SELECT from_csv(‘1, 0.8’, ‘a INT, b DOUBLE’);{“a”:1,”b”:0.8}
from_json 按照json格式解析字符串 SELECT from_json(‘{“a”:1, “b”:0.8}’, ‘a INT, b DOUBLE’);
schema_of_csv 返回csv类型的schema SELECT schema_of_csv(‘a b’,map(“sep”,” “));STRUCT<_c0: STRING, _c1: STRING>
schema_of_json 返回json类型的schema select schema_of_json(‘{“c1”:01, “c2”:0.1}’, map(‘allowNumericLeadingZeros’, ‘true’, ‘prefersDecimal’, ‘true’));
to_csv struct转csv SELECT to_csv(struct(‘a’, 1));1 named_struct只取value
to_json struct转json SELECT to_json(named_struct(‘a’, 1, ‘b’, 2));{“a”:1,”b”:2} SELECT to_json(struct(‘a’, 1, ‘b’, 2));{“col1″:”a”,”col2″:1,”col3″:”b”,”col4″:2}

判断函数

函数 简介 用法
any 参数为boolean类型的列,至少有一行为true就返回true select any(desc) from data;true
every 参数为boolean类型的列,全部为true就返回true select every(desc) from data;false
ifnull 参数1为空,就返回参数2 SELECT ifnull(1/3, 2);0.3333333333333333
isnan 表达式为NAN,则返回true select isnan(‘NAN’);true
nanvl 表达式不为NAN,返回第二个参数值 SELECT nanvl(cast(‘NaN’ as double), 123);123
nvl2 参数1为空则返回参数3,否则返回参数2 SELECT nvl2(NULL, 2, 1);1
signum 当参数为负、0或正时,返回-1.0、0.0或1.0  
some 参数为boolean类型的列,至少有一行为true就返回true select some(desc) from data;
bool_and 所有都是true返回true select bool_and(desc) from data;false
bool_or 有一个true返回true select bool_or(desc) from data;true
count_if 带条件的count select count_if(id % 2 ==0) from data;2

字符串函数

函数 简介 用法
char ASCII 码转换为字符 SELECT char(72);H
position 字符串查找 SELECT position(‘d’, ‘abcdefgh’);4
overlay 替换下标位4的字符 SELECT overlay(‘SparkSQL’,’_’,4);Spa_kSQL
xxhash64 64位的hash码 参数,数据类型,随机数种子 SELECT xxhash64(‘Spark’,array(123),2);
format_string 类似字符串拼接函数 SELECT format_string(“id%suser_id%s”, id,user_id) from data;id1user_id1

分区记录函数

函数 简介 用法
input_file_block_length 返回文件大小 select input_file_block_length() from data;
input_file_block_start 返回文件读取起始位置 select input_file_block_start() from data;0
input_file_name 返回文件地址 select input_file_name() from data;file:/root/spark-warehouse/data/dt=20220801/data_min
monotonically_increasing_id 64为ID,高31位分区ID低33位记录号,分区小于10亿,分区内记录小于80亿正确 select monotonically_increasing_id() from data limit 10;

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/database/282541.html

(0)
上一篇 2022年8月27日 20:08
下一篇 2022年8月27日 20:08

相关推荐

发表回复

登录后才能评论