hive学习笔记之六:HiveQL基础

欢迎访问我的GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;

《hive学习笔记》系列导航

  1. 基本数据类型
  2. 复杂数据类型
  3. 内部表和外部表
  4. 分区表
  5. 分桶
  6. HiveQL基础
  7. 内置函数
  8. Sqoop
  9. 基础UDF
  10. 用户自定义聚合函数(UDAF)
  11. UDTF

本篇概览

  • 本文是《hive学习笔记》系列的第六篇,前面的文章咱们对数据类型、表结构有了基本了解,接下来对常用的查询语句做一次集中式的学习;
  • HiveQL与SQL类似, 在语法上与大部分SQL兼容, 但是并非完全兼容,例如更新、事务等都不支持,子查询和join操作也有限, 这和底层依赖Hadoop有关;

准备数据

  1. 本次实战要准备两个表:学生表和住址表,字段都很简单,如下图所示,学生表有个住址ID字段,是住址表里的记录的唯一ID:
在这里插入图片描述
  1. 先创建住址表:
create table address (addressid int, province string, city string) 
row format delimited 
fields terminated by ',';
  1. 创建address.txt文件,内容如下:
1,guangdong,guangzhou
2,guangdong,shenzhen
3,shanxi,xian
4,shanxi,hanzhong
6,jiangshu,nanjing
  1. 加载数据到<font color="blue">address</font>表:
load data 
local inpath '/home/hadoop/temp/202010/25/address.txt' 
into table address;
  1. 创建学生表,其<font color="blue">addressid</font>字段关联了<font color="red">address</font>表的<font color="blue">addressid</font>字段:
create table student (name string, age int, addressid int) 
row format delimited 
fields terminated by ',';
  1. 创建<font color="blue">student.txt</font>文件,内容如下:
tom,11,1
jerry,12,2
mike,13,3
john,14,4
mary,15,5
  1. 加载数据到student表:
load data 
local inpath '/home/hadoop/temp/202010/25/student.txt' 
into table student;
  1. 至此,本次操作所需数据已准备完毕,如下所示:
hive> select * from address;
OK
1   guangdong   guangzhou
2   guangdong   shenzhen
3   shanxi  xian
4   shanxi  hanzhong
6   jiangshu    nanjing
Time taken: 0.043 seconds, Fetched: 5 row(s)
hive> select * from student;
OK
tom 11  1
jerry   12  2
mike    13  3
john    14  4
mary    15  5
Time taken: 0.068 seconds, Fetched: 5 row(s)
  • 开始体验HiveQL

select和where

最普通的带条件查询:

hive> select * from address where city like '%a%';
OK
1   guangdong   guangzhou
3   shanxi  xian
4   shanxi  hanzhong
6   jiangshu    nanjing
Time taken: 0.128 seconds, Fetched: 4 row(s)

group by

  1. 按<font color="blue">province</font>字段分组:
select province, count(*) from address group by province;

该查询会触发MR计算,结果如下:

...
Total MapReduce CPU Time Spent: 1 seconds 910 msec
OK
guangdong   2
jiangshu    1
shanxi  2
Time taken: 17.847 seconds, Fetched: 3 row(s)
  1. 试试嵌套查询,内部是查出city字段带有a字母的记录,然后将这些记录按照province字段分组:
select t.province, count(*) from (
    select * from address where city like '%a%'
) t 
group by t.province;

结果如下:

Total MapReduce CPU Time Spent: 1 seconds 760 msec
OK
guangdong   1
jiangshu    1
shanxi  2
Time taken: 18.036 seconds, Fetched: 3 row(s)

having

  • 前面的嵌套查询,结果有两个省:guangdong和shanxi,如果再加个条件:只显示城市数量大于1的省,首先想到的是再加一层嵌套:
select t1.* from (
    select t.province, count(*) as cnt from (
        select * from address where city like '%a%'
    ) t 
group by t.province) t1 
where t1.cnt>1; 

结果如下,可见只有shanxi被显示了:

Total MapReduce CPU Time Spent: 2 seconds 250 msec
OK
shanxi  2
Time taken: 20.067 seconds, Fetched: 1 row(s)
  • 对于上述SQL,可以用<font color="blue">having</font>语法进行分组筛选,得到同样数据:
select t.province, count(*) as cnt from (
        select * from address where city like '%a%'
    ) t 
group by t.province having cnt>1;

order by

  • 对分组结果做排序:
select t.province, count(*) as cnt from (
        select * from address where city like '%a%'
    ) t 
group by t.province order by cnt;

会触发MR,结果如下:

Total MapReduce CPU Time Spent: 3 seconds 50 msec
OK
jiangshu    1
guangdong   1
shanxi  2
Time taken: 40.315 seconds, Fetched: 3 row(s)
  • <font color="blue">order by</font>对于的实现,是在最后通过一个reducer进行全部排序,该过程可能耗时较长,针对这种情况,hive提供了<font color="blue">sort by</font>,功能与<font color="blue">order by</font>一样,但是会在每个reducer中进行排序,这样最终做排序的时候效率就会提升;
  • 要注意的是:<font color="blue">sort by</font>解决的问题是最终结果排序的效率,因此数据量不大时,排序不是瓶颈,此时使用<font color="blue">sort by</font>也不会加快整体速度;

内连接(inner join)

  • 内连接用<font color="blue">join</font>简写,与连接标准匹配的数据在两张表中都存在,才会保留:
select 
  s.name, s.age, 
  a.province, a.city 
from 
  student s 
  inner join 
  address a 
on 
  s.addressid=a.addressid;

结果如下:

Total MapReduce CPU Time Spent: 1 seconds 20 msec
OK
tom 11  guangdong   guangzhou
jerry   12  guangdong   shenzhen
mike    13  shanxi  xian
john    14  shanxi  hanzhong
Time taken: 17.294 seconds, Fetched: 4 row(s)

自然连接(natural join)

  • 自然连接是在两张表中寻找数据类型和列明都相同的字段,并自动连接起来:
select name, age, province, city from student natural join address;

结果如下,可见<font color="red">不会</font>根据student表的addressid字段值去address查找记录,而是将addrerss的记录全部连接一次:

Total MapReduce CPU Time Spent: 940 msec
OK
tom 11  guangdong   guangzhou
jerry   12  guangdong   guangzhou
mike    13  guangdong   guangzhou
john    14  guangdong   guangzhou
mary    15  guangdong   guangzhou
tom 11  guangdong   shenzhen
jerry   12  guangdong   shenzhen
mike    13  guangdong   shenzhen
john    14  guangdong   shenzhen
mary    15  guangdong   shenzhen
tom 11  shanxi  xian
jerry   12  shanxi  xian
mike    13  shanxi  xian
john    14  shanxi  xian
mary    15  shanxi  xian
tom 11  shanxi  hanzhong
jerry   12  shanxi  hanzhong
mike    13  shanxi  hanzhong
john    14  shanxi  hanzhong
mary    15  shanxi  hanzhong
tom 11  jiangshu    nanjing
jerry   12  jiangshu    nanjing
mike    13  jiangshu    nanjing
john    14  jiangshu    nanjing
mary    15  jiangshu    nanjing
Time taken: 18.525 seconds, Fetched: 25 row(s)

左外连接(left outer join)

  • 以连接中的左表为主:
select 
  s.name, s.age, s.addressid, 
  a.province, a.city 
from 
  student s 
  left outer join 
  address a 
on 
  s.addressid=a.addressid;

结果如下,可见name=mary的记录,addressid等于5,在address中不存在addressid等于5的记录,因此province和city字段都展示了NULL,而在前面使用inner join时,结果中没有这条记录:

Total MapReduce CPU Time Spent: 950 msec
OK
tom 11  1   guangdong   guangzhou
jerry   12  2   guangdong   shenzhen
mike    13  3   shanxi  xian
john    14  4   shanxi  hanzhong
mary    15  5   NULL    NULL
Time taken: 18.442 seconds, Fetched: 5 row(s)

右外连接(right outer join)

和左连接类似,只不过是以右表为主,语法是<font color="blue">right outer join</font>:

select 
  s.name, s.age, s.addressid, 
  a.province, a.city 
from 
  student s 
  right outer join 
  address a 
on 
  s.addressid=a.addressid;

结果如下,可见<font color="blue">city=nanjing</font>的记录,在student表中没有一条记录与之关联,因此结果中展示了address的字段,而student的字段为NULL:

Total MapReduce CPU Time Spent: 970 msec
OK
tom 11  1   guangdong   guangzhou
jerry   12  2   guangdong   shenzhen
mike    13  3   shanxi  xian
john    14  4   shanxi  hanzhong
NULL    NULL    NULL    jiangshu    nanjing
Time taken: 18.294 seconds, Fetched: 5 row(s)

全外连接(full outer join)

查询结果等于左外连接和右外连接之和,语法是<font color="blue">full outer join</font>:

select 
  s.name, s.age, s.addressid, 
  a.province, a.city 
from 
  student s 
  full outer join 
  address a 
on 
  s.addressid=a.addressid;

结果如下:

Total MapReduce CPU Time Spent: 2 seconds 630 msec
OK
tom 11  1   guangdong   guangzhou
jerry   12  2   guangdong   shenzhen
mike    13  3   shanxi  xian
john    14  4   shanxi  hanzhong
mary    15  5   NULL    NULL
NULL    NULL    NULL    jiangshu    nanjing
Time taken: 22.189 seconds, Fetched: 6 row(s)
  • 至此,常用HiveQL体验完毕,希望能给您一些参考,接下来的章节会进一步学习HiveQL的特性;

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

欢迎关注公众号:程序员欣宸

微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...
https://github.com/zq2599/blog_demos

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

推荐阅读更多精彩内容