Hive学习二

六、hive 的函数

查看有多少函数

show functions;

查看函数 substr 的详细信息

desc function substr;

查看函数 substr 的扩展信息,会有使用例子

desc function extended substr;

查询地址:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-Built-inFunctions

1、类型转化函数 cast

cast 属性强转,把字符串转成 int

select cast('5' as int);

查看上述结果的数据类型,可以新建一个表来实现

create table t_test

as select cast(“6”as int)

来查看字段的类型

desc t_test

[图片上传失败...(image-f38638-1546767417378)]

转化成 date 类型

select cast(“2017-08-09”as date);

时间的强制转换:使用 to_date 函数也可以

current_timestamp 是hive里面的时间,是一个常量

current_date 是 2018-11-20

unix_timestamp() 是时间戳,带括号是因为可以传入字符参数转换为时间戳

[图片上传失败...(image-b42641-1546767417378)]

将时间戳转化为 date,结果如下图

select cast(current_timestamp as date);

[图片上传失败...(image-f0287d-1546767417378)]

求当前时间的时间戳,这是一个函数,结果是一个常量,如下图

这个不能使用 cast 来转换成 date 类型,但是可以通过其他方式

[图片上传失败...(image-754d97-1546767417378)]

2、数学运算

四舍五入,得5

select round(5.4):

保留 3 位小数,得 5.135

select round(5.1354,3);

向上取整,得6,也可以写作 celling

select cell(5.4);

向下取整,得 5

select floor(5.4);

取绝对值,得5.4

select abs(-5.4);

取最大值,得6,参数个数任意最少两个

select greatest(3,5,6);

取最小值,得 3

select least(3,5,6);

eg:表数据如下

[图片上传失败...(image-d92c3a-1546767417377)]

求每个人三种收入的最大的一个值是多少,并且要转换成 double,结果如下图

这是针对每一行来求的

select greatest(cast(s1 as double),cast(s2 as double),cast(s3 as double))from t_fun2;

[图片上传失败...(image-f8e975-1546767417377)]

这是聚合函数,是针对一个字段数据(一列)来求的

一般聚合函数是要使用 group by 分组,这里没加就是整个数据看做是一个组

select max(age)from t_person;

select min(age)from t_person;

3、字符串函数

a、字符串截取,substr

截取字段数据中的一部分,例如截取 [http://www.edu360.cn/job](http://www.edu360.cn/job) 这种的url

这里1 表示第一位,21为最后一个/,(从0开始和从1开始是一样的,所以写1比较好)

1 表示位置,21 表示长度如果没写表示截取后面的全部数据

select ip,substr(url,1,21)from t_access;

[图片上传失败...(image-da6aab-1546767417377)]

b、拼接函数,concat

字符串拼接,得到 abxy ,传入 string 类型的字段即可

select concat(“ab”,“xy”);

使用分隔符来拼接,这里用点来连接,得到 192.168.109.17

select concat_ws(“.”, "192",“168”,“109”,“17”);

c、求长度,length

这里的长度是 14

select length(“192.168.109.17 ”);

d、切割,split

返回一个数组,["18","male","beijing"],所以还可以用角标来得到数据

select split(“18:male:beijing”,“:”)

[图片上传失败...(image-ddf2ea-1546767417377)]

注意: 这里点号因为是正则表达式里的符号,所以要用 ,但是 \ 也是特舒符,所以用 \.

select split(“192.168.109.17 ”,“\.”)

e、大写:upper

4、时间函数

如果 cast 函数不能将一些时间表示转换为时间类型(如 cast(“2017-09-08 11:34:36”as date),不包含时分秒就能转成功),那么可以使用以下方法

当前的时间戳,结果如下图,这是 hive的时间戳,和 java里面的时间戳是常数不太一样

select current_timestamp;

[图片上传失败...(image-28fa59-1546767417377)]

当前的日期,结果如下图

select current_date;

[图片上传失败...(image-9b8243-1546767417377)]

取当前时间的毫秒数时间戳(unix 时间戳),是一个常量

select unix_timestamp();

[图片上传失败...(image-257607-1546767417377)]

a、unix 时间戳转字符串

这里是使用常数来转换为字符串(这里是使用当前时间戳),格式可选传入

select from_unixtime( unix_timestamp());

结果如下图,格式是什么就显示什么

select from_unixtime( unix_timestamp(),“yyyy-MM-dd HH:mm:ss”) ;

[图片上传失败...(image-64e046-1546767417377)]

b、字符串转 unix时间戳

select unix_timestamp(“2017-08-19 18:50:30”);

结果如下图

select unix_timestamp(“2017/08/10 17:50:30”, "yyyy/MM/dd HH:mm:ss")

[图片上传失败...(image-169f43-1546767417377)]

c、将字符串转成日期 date:这个应该就是 hive 时间戳

这里不能传格式,只支持标准时间写法的字符串

select to_date(“2017-09-17 16:57:32”)

[图片上传失败...(image-e9041b-1546767417377)]

d、把 date 转换为 string:使用 cast 强制转换

七、表生成函数

:依靠函数就能生成一张表。平常是 select 可以生成一个表

1、行转列函数:explode()

eg:如果有以下数据,表示每个人选修个课程

1,zhangsna,化学:物理:数学:语文

2,lisi,化学:数学:生物:生理卫生

3,wangwu,化学:语文:英语:体育:生物

将上面的数据映射为一张表,查询数据如下图

create table t_stu_subject(id int,name string,subjects array<string>)

row format delimited fields teminated by ","

collection items terminated by ":";

[图片上传失败...(image-4ced22-1546767417377)]

要求所有人选的课程里面去重后的结果,就是要求有多少个课程

使用 explode()对数组字段‘炸裂’(把结构化的数据打散),结果如下图,每一个数组都炸成若干行

select explode(subjects)from t_stu_subject;

[图片上传失败...(image-52fc6b-1546767417377)]

根据上面的查询结果,就可以做去重的操作了,使用子查询

select distinct tmp.sub from

(select explode(subjects)as sub from t_stu_subject)tmp ;

2、lateral view(翻译:横向视图)

要求实现炸裂的每一条课程可以和对应的学生信息连接起来

注意 explode(subjects)是一个表,lateral view 是取横向连接两个表

tmp 是对炸裂后的表的重命名(跟在表后面是重命名),并且把炸裂后的字段命名为 sub ,子查询必须要取别名,所有有tmp。sub 可以省略但是新列就没有名字。

(这个写法挺奇怪的,在重命名表名后又重命名字段,可能要特殊记忆)

select id,name,tmp.sub

from t_stu_subject lateral view explode( subjects ) tmp as sub;

[图片上传失败...(image-562192-1546767417377)]

注意:这样炸裂后拼接,有利于后期的一些计算。

练习题:有一个文本文件如下,要求出每个单词出现的次数?

[图片上传失败...(image-dc64cd-1546767417377)]

思路:先建表映射上面的数据,使用 array 结构体类型,然后炸裂,再根据炸裂表分组查询统计

先建表映射数据,一行看做一个句子,所以只需要一个字段

create table t_wc( sentence string );

[图片上传失败...(image-98b278-1546767417377)]

切词,使用空格来切分,得到一个数组

select split(sentence," ")from t_wc;

[图片上传失败...(image-5d40df-1546767417377)]

把结构体类型 数组 炸裂,然后分组查询

并按照字符数量,倒序列出结果,如下图

select word,count(1)as cnts

from(select explode(split(sentence," "))as word from t_wc)tmp

group by word

order by cnts desc; (这里可以使用查询结果排序,但是不能group by)

[图片上传失败...(image-c0afd2-1546767417377)]

select

b.b_movie,

b.b_rate,

b.b_timeStamp,

b.b_uid

from json a

lateral view json_tuple(a.data,'movie','rate','timeStamp','uid') b as b_movie,b_rate,b_timeStamp,b_uid;

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

推荐阅读更多精彩内容