美文网首页
常用spark sql函数整理

常用spark sql函数整理

作者: 星城天空 | 来源:发表于2022-08-21 16:14 被阅读0次

    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)

    相关文章

      网友评论

          本文标题:常用spark sql函数整理

          本文链接:https://www.haomeiwen.com/subject/qubvgrtx.html