Hive

1. 简介

Hive是一款基于Hadoop的数据仓库工具,设计初衷就是使不擅长编程的数据分析人员也能参与到大数据中来,常用功能是数据提取转化加载(ETL)和数据分析。其使用存储在HDFS中的数据,可以将结构化的数据文件映射为一张数据库表,并将SQL语句转换为MapReduce任务(目前不止MapReduce,还包括Spark和TEZ)执行查询。

2. 架构

Hive架构如图11所示:由客户端提供查询语句,提交给Hive,Hive再交给Driver处理(Compiler先编译,编译时要从元数据库中获取元数据信息,生成逻辑计划;生成物理计划;由优化器进行优化;执行器提交任务,同时还需要提取元数据信息关联具体的数据,这些元数据信息送到HDFS的数据节点),并将结果返回或写入HDFS。


image.png

3. 特点

3.1 可扩展性

Hive 可以自由的扩展集群的规模,Hive 本身只是将 HSQL 解析为 MapReduce 任务,数据存储在 HDFS,所以其扩展性取决与 Hadoop 的扩展性 。

3.2 支持自定义函数

Hive 支持自定义函数,用户可以根据自己的需求来实现自己的函数。

3.3 高容错性

可以保障即使有节点出现问题,SQL 语句仍可完成执行。由于 Hive 本身只是将 HSQL 解析为 MapReduce 任务,其容错性取决于底层的文件系统HDFS,和计算引擎 MapReduce,而HDFS 和 MapReduce 定位是运行在通用硬件上,因此容错性可以保障。

4. 语法

4.1 DDL

4.1.1 数据库操作

4.1.1.1 创建

create database if not exists hive;
# 同 mysql

4.1.1.2 查询数据库列表

show databases;
# 同 mysql

4.1.1.3 删除数据库

drop database if exists hive;
# 同 mysql
drop database if exists hive cascade;
# 删除带表的数据库

4.1.1.4 描述数据库

desc database hive;
# 同 mysql

4.1.1.5 查看当前使用的数据库

select current_database();

4.1.1.6 切换数据库

use hive;
# 同 mysql

4.1.2 表操作

4.1.2.1 创建表

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

  [(col_name data_type [COMMENT col_comment], ...)]

  [COMMENT table_comment]

  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]

  [CLUSTERED BY (col_name, col_name, ...)

    [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]

  [ROW FORMAT row_format]

  [STORED AS file_format]

  [LOCATION hdfs_path]
  • EXTERNAL:指定创建外部表。
  • COMMENT:可以为表和字段添加描述。
  • PARTITIONED BY:指定分区字段(支持多属性分区)。
  • CLUSTERED BY: 指定分桶字段,分桶和分区的区别:分桶字段在文件中中,分区字段不在文件中。
  • SORTED BY:指定桶内排序字段。
  • ROW FORMAT:指定分割符。
  • STORED AS :文件类型。
  • LOCATION:表路径。
4.1.2.1.1 创建内部表
  • 创建表
create table student(id int, name string, sex string, age int,department string) row format delimited fields terminated by ",";
* 导入数据
load data INPath '/Users/dreamaker/Downloads/apache-hive-2.3.4-bin/data/tableA' into table tableA;

  • 查询数据
select a.id,a.name,a.grade,a.dept,b.id,b.name from tableA a left join tableB b on a.dept=b.id and a.grade>80;

4.1.2.1.2 创建外部表

在创建内部表语法基础上,需使用 EXTERNAL 关键字,并指定 location 。

4.1.2.1.3 创建分区表
  • 在内部表(或外部表)的基础上,指定 PARTITIONED BY 属性
  • 使用 alter 命令添加分区。
alter table tablename add partition(key=value);
  • load data 目录的基础上,添加 partition(key=value)命令。
load data local inpath "/home/hadoop/student.txt" into table student_ptn partition(city="beijing");

  • 动态分区
    创建分区表
create table student_ptn_age(id int,name string,sex string,department string) partitioned by (age int);

在插入数据时指定按照查询结果中的某个属性分区

insert overwrite table student_ptn_age partition(age) select id,name,sex,department,age from student_ptn;

4.1.2.1.4 创建分桶表

在普通表的基础上,使用CLUSTERED BY (col_name, col_name, ...)[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS命令。

4.1.2.1.5 使用 CTAS 创建表
create table student_ctas as select * from student where id < 95012;
4.1.2.1.6 复制表结构
create table stu like student;

4.1.2.2 查看表

  • 查看表基本信息
desc tablename;
  • 查看表详细信息
desc extended tablename;
  • 格式化表详细信息
desc formatted tablename;
  • 查看表分区信息
show partitions tablename;
  • 查看表的详细建表语句
show create table tablename;

4.1.2.3 列举表

  • 列举当前数据库中的所有表
show tables;
  • 列举指定数据库中的所有表
show tables in hive;
  • 模式匹配当前数据库中的所有表
show tables like 'stu*';

4.1.2.4 修改表

4.1.2.4.1 修改表名
alter table oldname rename to newname;
4.1.2.4.2 添加列
alter table tablename add colums (filed,datatype);
4.1.2.4.3 修改一列的定义
alter table tablename change old_columname  new_columname datatype;
4.1.2.4.4 替换所有字段
alter table tablename replaces columns (columname,datatype...);
4.1.2.4.5 添加分区

前文创建分区表中已演示,支持批量添加分区。

4.1.2.4.6 修改分区的存储目录
alter table student_ptn partition (city='beijing') set location '/student_ptn_beijing';

4.1.2.4.7 删除分区
alter table student_ptn drop partition (city='beijing');

4.1.2.5 删除表

drop table tablename;

4.1.2.6 清空表

truncate table tablename;

4.1.3 视图操作

4.1.3.1 创建

create view view_cdt as select * from cdt;

4.1.3.2 查看视图列表

show views

4.1.3.3 描述视图

desc view_cdt;

4.1.3.4 查询视图

select * from view_cdt;

4.1.3.5 删除视图

drop view if exists view_cdt;

4.2 数据类型和存储格式

4.2.1 基本数据类型

布尔、整形、浮点型、字符型、字符串、字节数组、时间戳、日期

4.2.2 复合类型

类型 功能
array 有序的的同类型的集合
map key-value,key必须为原始类型,value可以任意类型
struct
uniontype
create table cdt(
id int, 
name string, 
work_location array<string>, 
piaofang map<string,bigint>, 
address struct<location:string,zipcode:int,phone:string,value:int>) 
row format delimited 
fields terminated by "\t" 
collection items terminated by "," 
map keys terminated by ":" 
lines terminated by "\n";

4.2.3 存储格式

数据格式
textfile 默认格式,存储方式为行存储。数据不做压缩,磁盘开销大,数据解析开销大。
SequenceFile 是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。支持三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低,一般建议使用BLOCK压缩。
RCFile 一种行列存储相结合的存储方式。
ORCFile 数据按照行分块,每个块按照列存储,其中每个块都存储有一个索引。hive给出的新格式,属于RCFILE的升级版,性能有大幅度提升,而且数据可以压缩存储,压缩快 快速列存取。
Parquet Parquet也是一种行式存储,同时具有很好的压缩性能;同时可以减少大量的表扫描和反序列化的时间。

4.3 函数

4.3.1 内置函数

4.3.1.1 数学函数

取整、随机数、数学运算

4.2.1.2 集合函数

size

4.2.1.3 类型转换

4.2.1.4 日期函数

4.2.1.5 条件函数

select case field1 when value1 then field2 else 0 as field3
case field1 when value2 then field2 else 0 as field4
# case 数等于 field1 不同的 value 数。  

4.2.1.6 字符函数

4.2.1.7 聚合函数

4.2.1.8 表生成函数

4.2.1.9 窗口函数

  • partition by:指定分组属性。
  • order by:指定排序属性。
  • 聚合函数:max()、min()、sum、avg()、rank()、ntile(n)、row_number()、dense_rank()
select max() over (partition by field1 [order by field2] [rows between unbounded/n preceding and current row/unbounded/n following])
  • preceding: 窗口左边界,可指定为 current row。
  • following: 窗口右边界,可指定为 current row。

4.2.2 查看内置函数列表

show functions

4.2.1.2 描述函数

desc function [extended]substr;

4.2.2 自定义函数 UDF

4.2.2 自定义函数

4.3 DQL

4.1 Join

关键字 功能
Join
Left Outer Join 返回左边表的所有行。
Right Outer Join 返回右边表的所有行。
Full Outer Join 包含两个表的所有行。

4.4 实战

4.4.1

  • 查询每个用户每月的 ucount 之和。
insert into table tmp_access select uname,umonth,sum(ucount) from t_access t group by t.uname,t.umonth;
  • 查询每个用户每个月的最高 umount,和 总 umount。
select name,mon,num,max(num) over (partition by name order by mon)  as max, sum(num) over (partition by name order by mon) as sum from tmp_access;

4.4.2 查询数学成绩高于其他成绩的学生

create view score_rank as select sid,course,rank() over (partition by sid order by score desc) as rn1 from course;
select * from score_rank where rn1=1 and course='shuxue';

4.4.3 查询每年的最高温度和具体哪一天

create view weather_rank as select substr(data,1,8) `date`,rank() over (partition by substr(data,1,4) order by substr(data,9,2) desc) as rn1 from weather; 
select * from weather_rank where rn1=1;

4.4.4 查询学生是否选择了某门课程

select id,case course when 'a' then 1 else 0 as a,
when 'b' then 1 else 0 as b,
when 'c' then 1 else 0 as c,
when 'd' then 1 else 0 as d,
when 'e' then 1 else 0 as e,
when 'f' then 1 else 0 as f;
select id,max(a),max(b),max(c),max(d),max(e),max(f) group by id;

4.4.5 求月销售额和累计到当月的总销售额

窗口函数

5. 数据仓库理论

image.png
功能
ODL
BDL
IDL
ADL
DIC

参考资料

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

推荐阅读更多精彩内容

  • Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。本...
    felix521阅读 1,257评论 0 0
  • Hive是什么? Hive是一种基于Hadoop的数据库技术并提供完整的sql查询功能, . HIVE能做什么? ...
    日出卡尔阅读 2,494评论 0 0
  • 快乐大数据第5次课 hive(1)工作原理Hive的执行入口是Driver,执行的SQL语句首先提交到Drive驱...
    快乐大数据阅读 363评论 0 0
  • 忘了谁说过,唯读书与健康不可辜负!但真不好意思,这两样我都辜负了。 我是一个辜负了自己的堕落儿! 01 以前还算爱...
    青竹青涵阅读 268评论 0 1