HIVE 常用函数及实例

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

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的一致。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,446评论 0 13
  • 1 常见本地文件: 2 上传到hdfs上: 3 下载到指定目录: 4 创建外部表: 5 加载hdfs文件: 加载本...
    码出高效阅读 174评论 0 0
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,169评论 0 9
  • 很久以前就有了写作的想法,只是由于一系列原因,迟迟未能动笔,而现在,当我真的动笔去写的时候,才发现现实远比想像中要...
    潘潘的成长之路阅读 805评论 1 1
  • 你还一大口一大口的喝。
    墨沙阅读 126评论 0 1