文章目录
由于工作需求,学习了 尚硅谷Hive教程1-41集,并根据课程内容整理以下笔记
1.基础知识
1.1概念
Hive:由Facebook开源用于解决海量结构化日志的数据统计。
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。
本质是:将HQL转化成MapReduce程序
- 1
- 2
- 3
1.2架构原理
1.3Hive和数据库比较
由于 Hive 采用了类似SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库。
其实从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。
- 1
- 2
2.基本操作
2.1常用交互命令
hive -e "sql语句" # 不进入hive交互窗口执行sql语句
hive -f xxx.sql # 不进入hive交互窗口执行脚本中的sql语句
- 1
- 2
2.2其他命令操作
hive>exit; # 退出hive窗口
hive>quit; # 退出hive窗口
hive>dfs -ls /; # 查看hdfs文件系统
hive>! ls /opt/module/datas; # 查看本地文件系统
cat .hivehistory # 查看在hive中输入的所有历史命令
- 1
- 2
- 3
- 4
- 5
3.数据类型
3.1基本数据类型
3.2集合数据类型
4.DDL数据定义
4.1CRUD操作
create database db1 if not exists;
show databases;
desc database db1; # 显示数据库信息
use db1;
alter database db1 set dbproperties('createtime'='20170830'); # 修改数据库
drop database db1 if exists db1; # 删除空数据库
drop database db1 cascade; # 强制删除非空数据库
- 1
- 2
- 3
- 4
- 5
- 6
- 7
4.2表
4.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]
# 实例
create table if not exists student2(
id int, name string
)
row format delimited fields terminated by '\t'
stored as textfile
location '/user/hive/warehouse/student2';
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
4.2.2表的分类
- 管理表
默认创建的表都是管理表,有时也被称为内部表。Hive默认情况下会将这些表的数据存储在由配置项所定义的目录的子目录下。 当删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。 - 外部表 EXTERNAL
删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。 - 分区表
分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。
# 创建分区表
create table dept_partition(
deptno int, dname string, loc string
)
partitioned by (month string)
row format delimited fields terminated by '\t';
# 单分区查询
select * from dept_partition where month='201709';
# 多分区联合查询
select * from dept_partition where month='201709'
union
select * from dept_partition where month='201707';
# 创建单个分区
alter table dept_partition add partition(month='201706') ;
# 同时创建多个分区
alter table dept_partition add partition(month='201705') partition(month='201704');
# 删除单个分区
alter table dept_partition drop partition (month='201704');
# 同时删除多个分区
alter table dept_partition drop partition (month='201705'), partition (month='201706');
# 查看分区表有多少分区
show partitions dept_partition;
# 查看分区表结构
desc formatted dept_partition;
# 查询表结构
desc dept_partition;
# 添加列
alter table dept_partition add columns(deptdesc string);
# 替换列
alter table dept_partition replace columns(deptno string, dname string, loc string);
# 删除表
drop table dept_partition;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
注:alter只修改元数据,不修改实际数据
5.DML数据操作
load data [local] inpath '/opt/module/datas/student.txt' overwrite | into table student [partition (partcol1=val1,…)];
- 1
(1)load data:表示加载数据
(2)local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表
(3)inpath:表示加载数据的路径
(4)overwrite:表示覆盖表中已有数据,否则表示追加
(5)into table:表示加载到哪张表
(6)student:表示具体的表
(7)partition:表示上传到指定分区
6.查询
方法同Mysql语法
- 全局排序(Order By)
- 每个MapReduce内部排序(Sort By)
- 分区排序(Distribute By)
- Cluster By(当distribute by和sorts by字段相同时可以使用cluster by)
7.其他
可参考博客: