zoukankan      html  css  js  c++  java
  • spark-sql 与hive 常用函数

    窗口函数与分析函数
    应用场景:
    (1)用于分区排序
    (2)动态Group By
    (3)Top N
    (4)累计计算
    (5)层次查询

    窗口函数
    FIRST_VALUE:取分组内排序后,截止到当前行,第一个值
    LAST_VALUE: 取分组内排序后,截止到当前行,最后一个值
    LEAD(col,n,DEFAULT) :用于统计窗口内往下第n行值。第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)
    LAG(col,n,DEFAULT) :与lead相反,用于统计窗口内往上第n行值。第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)

    OVER从句
    1、使用标准的聚合函数COUNT、SUM、MIN、MAX、AVG
    2、使用PARTITION BY语句,使用一个或者多个原始数据类型的列
    3、使用PARTITION BY与ORDER BY语句,使用一个或者多个数据类型的分区或者排序列
    4、使用窗口规范,窗口规范支持以下格式:

    当ORDER BY后面缺少窗口从句条件,窗口规范默认是 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

    当ORDER BY和窗口从句都缺失, 窗口规范默认是 ROW BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.

    OVER从句支持以下函数, 但是并不支持和窗口一起使用它们。
    Ranking函数: Rank, NTile, DenseRank, CumeDist, PercentRank.
    Lead 和 Lag 函数.

    分析函数
    ROW_NUMBER() 从1开始,按照顺序,生成分组内记录的序列,比如,按照pv降序排列,生成分组内每天的pv名次,ROW_NUMBER()的应用场景非常多,再比如,获取分组内排序第一的记录;获取一个session中的第一条refer等。
    RANK() 生成数据项在分组中的排名,排名相等会在名次中留下空位
    DENSE_RANK() 生成数据项在分组中的排名,排名相等会在名次中不会留下空位
    CUME_DIST 小于等于当前值的行数/分组内总行数。比如,统计小于等于当前薪水的人数,所占总人数的比例
    PERCENT_RANK 分组内当前行的RANK值-1/分组内总行数-1
    NTILE(n) 用于将分组数据按照顺序切分成n片,返回当前切片值,如果切片不均匀,默认增加第一个切片的分布。NTILE不支持ROWS BETWEEN,比如 NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)。

    增强的聚合 Cube和Grouping 和Rollup
    这几个分析函数通常用于OLAP中,不能累加,而且需要根据不同维度上钻和下钻的指标统计,比如,分小时、天、月的UV数。

    GROUPING SETS
    在一个GROUP BY查询中,根据不同的维度组合进行聚合,等价于将不同维度的GROUP BY结果集进行UNION ALL,
    其中的GROUPING__ID,表示结果属于哪一个分组集合。

    CUBE
    根据GROUP BY的维度的所有组合进行聚合。

    数学函数

    round(double d, int n):返回保留n位小数的近似d值
    floor(double d): 返回小于d的最大整值
    ceil(double d): 返回大于d的最小整值
    rand(int seed): 返回随机数,seed是随机因子
    bin(int d): 计算二进制值d的string值
    日期函数

    to_date(string timestamp):返回时间字符串中的日期部分,如to_date('1970-01-01 00:00:00')='1970-01-01'
    current_date:返回当前日期
    year(date):返回日期date的年,类型为int如year('2019-01-01')=2019
    month(date):返回日期date的月,类型为int,如month('2019-01-01')=1
    day(date): 返回日期date的天,类型为int,如day('2019-01-01')=1
    weekofyear(date1):返回日期date1位于该年第几周。如weekofyear('2019-03-06')=10
    datediff(date1,date2):返回日期date1与date2相差的天数,如datediff('2019-03-06','2019-03-05')=1
    date_add(date1,int1):返回日期date1加上int1的日期,如date_add('2019-03-06',1)='2019-03-07'
    date_sub(date1,int1):返回日期date1减去int1的日期,如date_sub('2019-03-06',1)='2019-03-05'
    months_between(date1,date2):返回date1与date2相差月份,如months_between('2019-03-06','2019-01-01')=2
    add_months(date1,int1):返回date1加上int1个月的日期,int1可为负数。如add_months('2019-02-11',-1)='2019-01-11'
    last_day(date1):返回date1所在月份最后一天。如last_day('2019-02-01')='2019-02-28'
    next_day(date1,day1):返回日期date1的下个星期day1的日期。day1为星期X的英文前两字母如next_day('2019-03-06','MO') 返回'2019-03-11'
    trunc(date1,string1):返回日期最开始年份或月份。string1可为年(YYYY/YY/YEAR)或月(MONTH/MON/MM)。如trunc('2019-03-06','MM')='2019-03-01',trunc('2019-03-06','YYYY')='2019-01-01'
    unix_timestamp():返回当前时间的unix时间戳,可指定日期格式。如unix_timestamp('2019-03-06','yyyy-mm-dd')=1546704180
    from_unixtime():返回unix时间戳的日期,可指定格式。如select from_unixtime(unix_timestamp('2019-03-06','yyyy-mm-dd'),'yyyymmdd')='20190306'
    条件函数

    if(boolean,t1,t2):若布尔值成立,则返回t1,反正返回t2。如if(1>2,100,200)返回200
    case when boolean then t1 else t2 end:若布尔值成立,则t1,否则t2,可加多重判断
    coalesce(v0,v1,v2):返回参数中的第一个非空值,若所有值均为null,则返回null。如coalesce(null,1,2)返回1
    isnull(a):若a为null则返回true,否则返回false
    字符串函数

    length(string1):返回字符串长度
    concat(string1,string2):返回拼接string1及string2后的字符串
    concat_ws(sep,string1,string2):返回按指定分隔符拼接的字符串
    lower(string1):返回小写字符串,同lcase(string1)。upper()/ucase():返回大写字符串
    trim(string1):去字符串左右空格,ltrim(string1):去字符串左空格。rtrim(string1):去字符串右空格
    repeat(string1,int1):返回重复string1字符串int1次后的字符串
    reverse(string1):返回string1反转后的字符串。如reverse('abc')返回'cba'
    rpad(string1,len1,pad1):以pad1字符右填充string1字符串,至len1长度。如rpad('abc',5,'1')返回'abc11'。lpad():左填充
    split(string1,pat1):以pat1正则分隔字符串string1,返回数组。如split('a,b,c',',')返回["a","b","c"]
    substr(string1,index1,int1):以index位置起截取int1个字符。如substr('abcde',1,2)返回'ab'
    聚合函数

    count():统计行数
    sum(col1):统计指定列和
    avg(col1):统计指定列平均值
    min(col1):返回指定列最小值
    max(col1):返回指定列最大值
    表生成函数
    与聚合函数相反,将字段内复杂的数据拆分成多行。

    explode (array):返回多行array中对应的元素。如explode(array('A','B','C'))返回

    explode(map):返回多行map键值对对应元素。如explode(map(1,'A',2,'B',3,'C'))返回

    explode常用来做行列转换。

    作者的原创文章,转载须注明出处。原创文章归作者所有,欢迎转载,但是保留版权。对于转载了博主的原创文章,不标注出处的,作者将依法追究版权,请尊重作者的成果。
  • 相关阅读:
    红帽7 创建网络会话
    红帽7 Iptables与Firewalld防火墙
    红帽7 配置网卡
    红帽7 LVM逻辑卷管理器
    红帽7 RAID磁盘冗余阵列
    红帽7 磁盘划分
    wpf学习一(转)
    选中当前点击的位置
    c#客显
    两个程序间的通信有三种
  • 原文地址:https://www.cnblogs.com/laoqing/p/15205019.html
Copyright © 2011-2022 走看看