常用spark sql函数整理

1.条件判断
if(条件判断,true,false)
case when 条件1 then 条件2 then 值 else 默认 end 字段名称

2.parse_url解析url字符串
parse_url(url,url部分,具体字段)
url部分:HOST,QUERY

3.map格式解析,列名[字段]
[uid -> 119024341,currPage -> indexpage,bannerType -> yueke,timestamp -> 1619440226820]这样格式的数据, 数据格式:map
props['presaleId'],key:value的解析形式

4.空值填充
nvl(a,b),如果a为空的时候,使用b进行填充, 适用于两个字段的判断和填充
coalesce(a,b,c),分别判断a,b,c的空值情况,依次进行填充

5.get_json_object(context,'$.字段')
context字段类型是字符串

6.按关键字截取字符串
substring_index(str,delim,count)
说明:substring_index(被截取字段,关键字,关键字出现的次数)
例:select substring_index("blog.jlb51.net","l", 2)
结果:blog.j
(注:如果关键字出现的次数是负数 如-2 则是从后倒数,到字符串结束)
例:select substring_index("blog.jlb51.net","l", -2)
结果:http://og.jlb51.net

7.cache table 表名,进行缓存

8.同一行,取出多个字段中最大值(greatest), 最小值(least)
sql语句,需要取出多个字段列中的最大值和最小值

9.explode会过滤空值的数据

10.udf
Spark官方UDF使用文档:Spark SQL, Built-in Functions

11.空值
表A需要筛选出a中不等于aaa的数据(a字段有空值)
错误:select * from A where a != 'aaa'(空值数据也被过滤了)
正确:select * from A where (a != 'aaa' or a is null)

12.ARRAY的相关操作
生成:collect_set(struct(a.lesson_id,b.lesson_title,b.lesson_type_id))
查询:where array_contains(字段,17(目标值))

13.修改表名
ALTER TABLE 原表 RENAME TO 目标表

14.first_value(),last_value

15.获取周几
date_format(字段(时间戳格式),'u')

16.struct字段类型

17.==
select 1=='1' true
select 1==1 true
select 1=='2' false
select 1=='jiang' 空 (\n)

18.case when a = 'xx' then 1
when a = 'yy' then 2
else 3 then 字段名

19.row_number() over(partition by trade_order_no order by )

20.not in
注意:当数据是空的时候,使用not in 会将空值排除

21.cache不仅可以提供计算效率,有时不适用还有造成数据错误
table1:
user_id 课程 时间 order_no
001 数学 20210701 20210701002
001 数学 20210701 20210701003
select *
,row_number() over(partition by user_id, 课程 order by 时间) px
from table1
as table1_order;

select *
from table1_order
where px = 1
as table1_part1;

select *
from table1 a
left anti join table1_part1 b on a.order_no = b.order_no -- 第一次
as table1_part2;

select * from table1_part1
union
select * from table1_part2
as result;

最后result的值,可能只有一条。
原因:table1_part1不cache住,会被计算两次,而之前的排序因时间相同,排序具有随机性,可能第一次排序20210701002的px为1,table1_part2为 20210701003;第二次计算时20210701003的px为1。 union去重之后,就只留下20210701003一条数据。这时候需要在table1_part1计算结束后,加cache,将结果锁住,防止再次计算。
原理参考:spark程序中cache的作用 + 实验 - 程序员大本营

22.union all结果顺序是随机的
a
union all
b
union all
c
结果可能是bca

23.2-null = null
涉及计算时,要将空值进行填充

24.行转列,列转行
行转列
collect_set(去重)/collect_list(不去重)
concat_ws(':',collect_set(字段))

列转行
一个字段的列转行:
SELECT stu_id,
stu_name,
ecourse
from student_score_new
lateral view explode(split(course,',')) cr ecourse -- 字段需要重新命名

多个字段的列转行:
SELECT stu_id,
stu_name,
ecourse,
escore,
from student_score_new
lateral view posexplode(split(course,',')) cr as a,ecourse
lateral view posexplode(split(score,',')) sc as b,ecourse

25.随机数
rand()生成[0,1)的小数
生成min到max到随机数,rand() * (max-min+1) + min
生成1,2,3随机数,rand()3 + 1
生成5,6,7,8随机数,rand()
4+5
order by rand() limit 200 -- 随机取200条数据

26.cube
cube函数 多用来实现钻取查询
将一个group by中单一维度分组后进行聚合,等价于将不同维度的GROUP BY结果集进行UNION ALL

27.grouping_id
标记出属于哪一类维度组合,相同的组合方式grouping_id的结果一样

28.rollup
以左侧维度为主聚合维度进行层级聚合,所有维度都为NULL时代表全部数据,rollup是cube的子集;可以快速实现由左及右的下钻分析。

29.lag
向上取数;lag(col,n,DEFAULT) 用于统计窗口内往上第n行值
第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)

30.lead
向下取数;lead(col,n,DEFAULT) 用于统计窗口内往下第n行值
第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)

31.ntile
对数据按照某一维度进行等比切片,如果数据不均匀,会优先补充上面分片的数据量

32.ROWS BETWEEN
ROWS BETWEEN是窗口子函数,借助该函数可限定累计的范围
select day, sid, pv, sum(pv) over(partition by sid order by day) pv1, sum(pv) over(partition by sid order by day ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) pv2 from VALUES('2020-04-04','a1',11), ('2020-04-03','d1',51), ('2020-04-02','d1',11), ('2020-04-01','d1',21), ('2020-04-04','d1',1) log(day, sid, pv)

33.计算每日零点至当前点,间隔15分钟所有点的SQL
WITH table1 AS (
SELECT '2022-11-28 00:15:00' AS window_start,1 AS test
UNION ALL
SELECT '2022-11-28 00:30:00' AS window_start,1 AS test
UNION ALL
SELECT '2022-11-28 00:45:00' AS window_start,1 AS test
UNION ALL
SELECT '2022-11-28 01:00:00' AS window_start,1 AS test
UNION ALL
SELECT '2022-11-28 01:15:00' AS window_start,1 AS test
UNION ALL
SELECT '2022-11-28 01:30:00' AS window_start,1 AS test
UNION ALL
SELECT '2022-11-28 01:45:00' AS window_start,1 AS test
UNION ALL
SELECT '2022-11-28 02:00:00' AS window_start,1 AS test
),
table2 AS (
SELECT FROM_UNIXTIME((FLOOR(unix_timestamp(appl_finished_dt, "yyyy-MM-dd HH:mm:ss")/900)*900)) as window_start,1 AS test
from fin_dw.xxx
where appl_finished_dt <= '2022-11-28 02:00:00' and appl_finished_dt >= '2022-11-28 00:00:00'
)
SELECT
b.window_start,
SUM(1) AS pv
FROM table2 a
JOIN table1 b
ON a.test = b.test and a.window_start <= b.window_start
GROUP BY b.window_start;

34.计算表存储文件数
查看表的存储空间:desc extended fin_dw.test
转换为gb单位:https://tool.browser.qq.com/byte_cal.html
估算表大小,128M一个文件,计算number
distribute by cast(rand()*number AS INT);

35.两个表数据集对比
--spark safelycc
select '张三' AS name,41 AS age
EXCEPT
select '张三' AS name,40 AS age

你可能感兴趣的:(常用spark sql函数整理)