美文网首页
HIVE 常用函数及实例

HIVE 常用函数及实例

作者: 清听 | 来源:发表于2018-02-27 11:34 被阅读181次

    本篇文章长更,欢迎大家收藏和喜欢

    2018.12.25 字符串函数2

    1.正则表达式解析函数:regexp_extract

    语法: regexp_extract(string subject, string pattern, int index)

    返回值: string

    说明:将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。

    举例:

    hive> select regexp_extract('foothebar', 'foo(.*?)(bar)', 1) fromlxw_dual;

    the

    hive> select regexp_extract('foothebar', 'foo(.*?)(bar)', 2) fromlxw_dual;

    bar

    hive> select regexp_extract('foothebar', 'foo(.*?)(bar)', 0) fromlxw_dual;

    foothebar

    注意,在有些情况下要使用转义字符,下面的等号要用双竖线转义,这是java正则表达式的规则。

    select data_field,

         regexp_extract(data_field,'.*?bgStart\\=([^&]+)',1) as aaa,

         regexp_extract(data_field,'.*?contentLoaded_headStart\\=([^&]+)',1) as bbb,

         regexp_extract(data_field,'.*?AppLoad2Req\\=([^&]+)',1) as ccc

         from pt_nginx_loginlog_st

         where pt = '2012-03-26'limit 2;

    2. URL解析函数:parse_url

    语法: parse_url(string urlString, string partToExtract [, stringkeyToExtract])

    返回值: string

    说明:返回URL中指定的部分。partToExtract的有效值为:HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, and USERINFO.

    举例:

    hive> selectparse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST') fromlxw_dual;

    facebook.com

    hive> selectparse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY','k1') from lxw_dual;

    v1

    3. json解析函数:get_json_object

    语法: get_json_object(string json_string, string path)

    返回值: string

    说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。

    举例:

    hive> select get_json_object('{"store":

    >  {"fruit":\[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],

    >   "bicycle":{"price":19.95,"color":"red"}

    >   },

    > "email":"amy@only_for_json_udf_test.net",

    >  "owner":"amy"

    > }

    > ','$.owner') from lxw_dual;

    amy

    2018.12.25 字符串函数2

    1.去空格函数:trim

    语法: trim(string A)

    返回值: string

    说明:去除字符串两边的空格

    举例:

    hive> select trim(' abc ') from lxw_dual;

    abc

    2.左边去空格函数:ltrim

    语法: ltrim(string A)

    返回值: string

    说明:去除字符串左边的空格

    举例:

    hive> select ltrim(' abc ') from lxw_dual;

    abc

    3.右边去空格函数:rtrim

    语法: rtrim(string A)

    返回值: string

    说明:去除字符串右边的空格

    举例:

    hive> select rtrim(' abc ') from lxw_dual;

    abc

    4.强制类型转换

    select cast(‘1’ as bigint) from dual;

    2018.12.20 字符串函数1

    1.字符串长度函数:length

    语法: length(string A)

    返回值: int

    说明:返回字符串A的长度

    举例:

    hive> select length('abcedfg') from lxw_dual;

    2.字符串截取函数:substr,substring

    语法: substr(string A, int start),substring(string A, int start)

    返回值: string

    说明:返回字符串A从start位置到结尾的字符串

    举例:

    hive> select substr('abcde',3) from lxw_dual;

    cde

    hive> select substring('abcde',3) from lxw_dual;

    cde

    hive>  selectsubstr('abcde',-1) from lxw_dual;  (和ORACLE相同)

    3.字符串转大写函数:upper,ucase

    语法: upper(string A) ucase(string A)

    返回值: string

    说明:返回字符串A的大写格式

    举例:

    hive> select upper('abSEd') from lxw_dual;

    ABSED

    hive> select ucase('abSEd') from lxw_dual;

    ABSED

    4.字符串转小写函数:lower,lcase

    语法: lower(string A) lcase(string A)

    返回值: string

    说明:返回字符串A的小写格式

    举例:

    hive> select lower('abSEd') from lxw_dual;

    absed

    hive> select lcase('abSEd') from lxw_dual;

    absed

    2018.12.17 统计函数

    Null值不参与计算

    •个数统计函数: count

    •总和统计函数: sum

    •平均值统计函数: avg

    •最小值统计函数: min

    •最大值统计函数: max

    2018.12.09 条件判断函数

    1.case when

    select

    case when X1  then A when X2 then B else C end result

    当满足X1条件,result输出A,当满足X2条件,result输出B,都不满足输出C

    2.if

    select

    if(判断条件,true返回值, 其他返回值)

    2018.12.06 排序函数

    排序函数包括Order by、Sort by、Distribute By、Cluster By…你知道它们的用法和不同吗?

    1. Order by:“我是全局排序”

    解读:order by 会对输入做全局排序,因此只会有一个reduce(多个reduce无法保证全局有序);这样当输入规模较大时,会导致较长的计算时间。

    2. distribute by:“我类似于分区,通常和Sort by一起使用” 解读:根据distribute by指定的字段把数据划分到不同的输出reduce文件中。

    3. Sort by:“我可以基于分区排序” 解读:sort by不是全局排序,其在数据进入reduce前完成排序,因此,当有多个reduce时,只能保证单个reduce输出有序,不能保证全局有序。

    4. Cluster By:“我的本领大,通常等同于 Distribute By + Sort by” 解读:cluster by 除了具有 distribute by 的功能外还兼具 sortby 的功能。 但是cluster by默认升序,不能指定排序规则为asc 或者desc。

    介绍完毕,再来个示例吧:

    例:近期参加初级、中级、高级认证的考生成绩如下:

    1)通过order by score asc,结果如下:

    注意:在hive.mapred.mode=strict模式下,使用order by时必须添加limit限制,能够大幅减少reducer数据规模。例如,当限制limit 10时,如果map的个数为20,则reducer的输入规模为10*20

    2)通过distribute by grade sort by score asc,结果如下:

    3) cluster by grade等价于distribute by grade sort by grade asc,但并不等价distribute by grade sort by score asc。细心的小伙伴发现不同了吗?所以cluster by的本领还是有点局限,distribute by colname1结合sort by colname2更实用哦。

    2018.11.22 正则表达式  regexp_extract

    语法:    regexp_extract(string subject,  string pattern,  int index)       返回值:string

    说明:  将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。

    第一参数:  要处理的字段

    第二参数:    需要匹配的正则表达式

    第三个参数:0是显示与之匹配的整个字符串   1 是显示第一个括号里面的    2 是显示第二个括号里面的字段...

    实例:

    regexp_extract('00aa0', '([0-9]+)', 0)   --00

    rregexp_extract('00aa0', '([0-9]+)([a-z]+)', 0)  --00aa

    正则中常用的表达式

    中文:[\u4e00-\u9fa5] 

    英文字母:[a-zA-Z] 

    数字:[0-9] 

    匹配中文,英文字母和数字及_: ^[\u4e00-\u9fa5_a-zA-Z0-9]+$

    同时判断输入长度:[\u4e00-\u9fa5_a-zA-Z0-9_]{4,10}

    2018.11.20 行转列、列转行、多行转单行、一列转多列

    行转列、列转行、多行转单行、一列转多列

    ①行转列:

    应用场景:

    select

    name,

    concat_ws('', collect_set(ywscore)) ywscore,  --多行转一行

    concat_ws('', collect_set(sxscore)) sxscore,

    from

    (select 

    name,

    case when  subject='语文' then score end 'ywscore',

    case when  subject='语文' then score end 'sxscore'

    from XXXX) 

    group by name

    collect_list--不去重,可替换collect_set

    ②列转行(一列转多行)

    列转行

    select name,score1

    from XXXXX

    lateral view explode(split(score, ',')) as score1  --spilt一列变多列

    2018.08.08 字符串替换

    字符串替换函数

    regexp_replace('abcde', 'a', 'm') ;--mbcde

    注意regexp_replace可以连用,最多连三次

    regexp_replace(regexp_replace(regexp_replace('abcde', 'a', 'm'), 'b', 'm'), 'c', 'm') --mmmde

    2018.06.01 时间函数

    8.其他日期函数

    查询当月第几天: dayofmonth(current_date);

    月末: last_day(current_date)

    当月第1天: date_sub(current_date,dayofmonth(current_date)-1)

    下个月第1天: add_months(date_sub(current_date,dayofmonth(current_date)-1),1)

    2018.05.27 时间函数

    1.日期转时间戳:从1970-01-01 00:00:00 UTC到指定时间的秒数

    select unix_timestamp(); 获得当前时区的UNIX时间戳

    select unix_timestamp('2018-05-27 14:23:00');--1527402180

    select unix_timestamp('2018-05-27 14:23:00','yyyy-MM-dd HH:mm:ss');

    select unix_timestamp('20180527 14:23:00','yyyyMMdd HH:mm:ss');

    2.时间戳转日期

    select from_unixtime(1527402180);--2018-05-27

    select from_unixtime(1505456567,'yyyyMMdd');

    select from_unixtime(1505456567,'yyyy-MM-dd HH:mm:ss');

    3.获取当前日期: current_date

    select current_date     --2018-05-27

    4.日期时间转日期:to_date(string timestamp)

    select to_date('2018-05-27 11:12:00') ;    --2018-05-27

    5.获取日期中的年/月/日/时/分/秒/周

    select year(dt),month(dt),day(dt),hour(dt),minute(dt),second(dt),weekofyear(dt)

    6.计算两个日期之间的天数: datediff

    select datediff('2018-05-27','2018-05-25') ; --2

    7.日期增加和减少: date_add/date_sub(string startdate,int days)

    select date_add('2018-05-27',1) ; --2018-05-28

    select date_sub('2018-05-27',1) ; --2018-05-26

    2018.03.21 取以经纬度范围多少公里数据

    ( abs(latitude - 30.528941640491446) * 111 <= 5 and abs(longitude - 120.69242) * 111 <= 5) 

    30.528941640491446是经度,120.69242是纬度,5是公里

    2018.03.10 map类型字段

    直接使用ext_columns["key"]可得到value

    json串解析:str_to_map(page_param) ['"skuid"']

    2018.03.04 字符串分割函数:split()

    split(split(ct_url,'com/') [1], '.html') [0]

    使用多个符号分割用[,],不仅可以取符号分割,还可以取字母,常用词组等

    split(cfv_cate_90dcate3, '[,#]') [4]   

    注意:分割后结果为数组,数组指针从0开始,所以必须带上[指针]调用

    2018.02.27 分组排序函数:row_number(),dense_rank(),rank()

    应用场景:对品类下去品牌销量TOP3,品牌下取销量TOP商品,各班级英语成绩最高的前3名,班级中各科成绩学生排名等。

    实例:对品牌下型号销量进行排序,取各品牌销量前三型号。

    建表,写入表数据如下:

    表结构

    取数脚本:

    SELECT

    brand,

    size,

    salenum,

    row_number() over(partition by brand order by salenum) row_number,

    dense_rank() over(partition by brand order by salenum) dense_rank,

    rank() over(partition by brand order by salenum) rank

    from

    dev_3c_xtzc.moring_share_rownumber_3c_zwh aa

    结果:

    结果展示

    其中:1.over为窗口函数,取当前查询的结果集2.partition可理解为切片分区,根据brand进行分区3.row_number、dense_rank和rank的区别是row_number遇到相同分数,不做并列,直接递增排序,dense_rank和rank会取并列值,rank并列值后跳过间隔排序,即最大值和row_number的一致。

    相关文章

      网友评论

          本文标题:HIVE 常用函数及实例

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