• sql 常用总结


    1、Hive中日期函数整理

    yyyymmdd和yyyy-mm-dd日期之间的切换

    方法1: from_unixtime+ unix_timestamp
    
    --20171205转成2017-12-05 
    select from_unixtime(unix_timestamp('20171205','yyyymmdd'),'yyyy-mm-dd') from dual;
    
    --2017-12-05转成20171205
    select from_unixtime(unix_timestamp('2017-12-05','yyyy-mm-dd'),'yyyymmdd') from dual;
    
    方法2: substr + concat
    
    --20171205转成2017-12-05 
    select concat(substr('20171205',1,4),'-',substr('20171205',5,2),'-',substr('20171205',7,2)) from dual;
    
    --2017-12-05转成20171205
    select concat(substr('2017-12-05',1,4),substr('2017-12-05',6,2),substr('2017-12-05',9,2)) from dual;
    
    方法3:
    --20171205转成2017-12-05
    to_date('20201231','yyyyMMdd')
    

    当前日期所在月份天数

    day(last_day('${--date(0,0,-1):yyyy-MM-dd--}'))
    

    日期相减

    datediff(to_date('20201231','yyyyMMdd'),to_date('20201230','yyyyMMdd'))
    

    2、常用函数汇总

    1、ntile

    https://help.aliyun.com/document_detail/158535.html

    2、行转列 & 列转行

    行转列
    eg.表
    hive > select * from table_a
    user_id order_id
    1 123
    1 123
    1 134
    2 145
    转换
    select user_id,concat_ws(',',collect_list(order_id)) as order_value
    from table_a
    where user_id is not null
    group by user_id
     
    user_id order_value
    1 123,123,134
    2 145
     
    select user_id,concat_ws(',',collect_set(order_id)) as order_value
    from table_a
    where user_id is not null
    group by user_id
     
    user_id order_value
    1 123,134
    2 145
     
    总结:使用函数: concat_ws(‘,’,collect_set(column))
    说明:collect_list 不去重,collect_set去重。column数据类型要求string
     
    列转行:
    user_id order_value
    1 123,134
    2 145
     
    select user_id, order_value,order_id from table_a
    lateral view explode(split(order_value,',')) num as order_id
    where user_id is not null
     
    user_id order_value order_id
    1 123,134 123
    1 123,134 134
    2 145 145
    总结:使用数组函数 lateral view explode(split(col,',')) num as col_1
    说明: num 自定义(目前没搞懂什么含义) ,where语句写在此函数下面
    

    3、百分位函数

    percentile:

    percentile(col, p) col是要计算的列(值必须为int类型),p的取值为0-1,若为0.2,那么就是2分位数,依次类推。

    percentile_approx:

    percentile_approx(col, p)。列为数值类型都可以。

    percentile_approx还有一种形式percentile_approx(col, p,B),参数B控制内存消耗的近似精度,B越大,结果的精度越高。默认值为10000。当col字段中的distinct值的个数小于B时,结果就为准确的百分位数。

    percentile_approx(a, array(0.2,0.4,0.6,0.8), 9999) as a
    

    3、常用指令

    参考:https://blog.csdn.net/ddydavie/article/details/80667727

    基础命令

    --1、快速查看表分区
    show table_a PARTITIONS
    
    --2、快速查看表分区
    show table_a PARTITIONS
    
    --3、显示所有的可用函数,包括运算符、内置函数、自定义函数
    show functions;
    
    --4、显示指定函数的描述信息
    desc function trim;
    
    --5、显示指定函数的详细信息
    desc function extended trim;
    
    --6、显示表结构
    desc formatted table_name;
    desc table_name;
    
    

    配置优化

    -- 开启任务并行执行
    set hive.exec.parallel=true
    
    -- 设置运行内存
    set mapreduce.map.memory.mb=1024;
    set mapreduce.reduce.memory.mb=1024;
    
    -- 指定队列
    set mapreduce.job.queuename=jppkg_high;
    
    -- 动态分区,为了防止一个reduce处理写入一个分区导致速度严重降低,下面需设置为false
    -- 默认为true
    set hive.optimize.sort.dynamic.partition=false;
    
    -- 设置变量
    set hivevar:factor_timedecay=-0.3;
    set hivevar:pre_month=${zdt.addDay(-30).format("yyyy-MM-dd")};
    set hivevar:pre_date=${zdt.addDay(-1).format("yyyy-MM-dd")};
    set hivevar:cur_date=${zdt.format("yyyy-MM-dd")};
    
    -- 添加第三方jar包, 添加临时函数
    add jar ***.jar;
    
    -- 压缩输出,ORC默认自带压缩,不需要额外指定,如果使用非ORCFile,则设置如下
    hive.exec.compress.output=true
    
    -- 如果一个大文件可以拆分,为防止一个Map读取过大的数据,拖慢整体流程,需设置
    hive.hadoop.suports.splittable.combineinputformat
    
    -- 避免因数据倾斜造成的计算效率,默认false
    hive.groupby.skewindata
    
    -- 避免因join引起的数据倾斜
    hive.optimize.skewjoin
    
    -- map中会做部分聚集操作,效率高,但需要更多内存
    hive.map.aggr   -- 默认打开
    hive.groupby.mapaggr.checkinterval  -- 在Map端进行聚合操作的条目数目
    
    -- 当多个group by语句有相同的分组列,则会优化为一个MR任务。默认关闭。
    hive.multigroupby.singlemr
    
    -- 自动使用索引,默认不开启,需配合row group index,可以提高计算速度
    hive.optimize.index.filter
    
  • 相关阅读:
    Spring学习总结[1]-入门
    MyBatis学习总结[5]-动态 SQL
    MyBatis学习总结[4]-ResultMap子元素
    MyBatis学习总结[3]-多表查询
    MyBatis学习总结[2]-接口式调用
    MyBatis学习总结[1]-入门
    Bootstrap table两种分页示例
    spring ioc原理(看完后大家可以自己写一个spring)
    Junit4单元测试
    数字转换为字母有多少种方式
  • 原文地址:https://www.cnblogs.com/SAN-W/p/13852327.html
Copyright © 2020-2023  润新知