阅读本篇文章大概需要15分钟
继上一篇大数据技术之Hive (一),今天更新第二篇,本篇主要分享Hive的DDL语句、DML操作。
DDL 语句
创建数据库
创建一个数据库,数据库在 HDFS 上的默认存储路径是:/user/hive/warehouse/*.db
在这里我还是要推荐下我自己建的大数据学习交流qq裙: 957205962, 裙 里都是学大数据开发的,如果你正在学习大数据 ,小编欢迎你加入,大家都是软件开发党,不定期分享干货(只有大数据开发相关的),包括我自己整理的一份2018最新的大数据进阶资料和高级开发教程,欢迎进阶中和进想深入大数据的小伙伴
hive (default)>create database db_hive;
避免要创建的数据库已经存在错误,增加 if not exists 判断。(标准写法)
hive (default)>create database
if not exists db_hive;
创建一个数据库,指定数据库在 HDFS 上存放的位置
hive (default)> create database db_hive2
location '/db_hive2.db';
修改数据库
用户可以使用 ALTER DATABASE 命令为某个数据库的 DBPROPERTIES 设置键-值对 属性值,来描述这个数据库的属性信息。数据库的其他元数据信息都是不可更改的,包括数 据库名和数据库所在的目录位置。
hive (default)> alter database db_hive
set dbproperties('createtime'='20170830');
在 mysql 中查看修改结果
hive> desc database extended db_hive;
查询数据库
显示数据库
hive> show databases;
过滤显示查询的数据库
hive> show databases like 'db_hive*';
查看数据库详情
显示数据库信息
hive> desc database db_hive;
显示数据库详细信息,extended
hive> desc database extended db_hive;
切换当前数据库
hive (default)> use db_hive;
删除数据库
删除空数据库
hive>drop database db_hive2;
如果删除的数据库不存在,最好采用 if exists 判断数据库是否存在
hive> drop database if exists db_hive2;
如果数据库不为空,可以采用 cascade 命令,强制删除
hive> drop database db_hive cascade;
创建表
建表语法
字段解释说明:
1、CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出 异常;用户可以用 IFNOTEXISTS 选项来忽略这个异常。
2、EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际 数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路 径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的 时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
3、COMMENT 为表和列添加注释。
4、PARTITIONED BY 创建分区表
5、CLUSTERED BY 创建分桶表
6、SORTED BY 分区排序
7、ROW FORMAT DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char][MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户 还需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive 通过 SerDe确定表的具体的列的数据。
8、STOREDAS 指定存储文件类型
9、LOCATION 指定表在 HDFS 上的存储位置
10、LIKE 允许用户复制现有的表结构,但是不复制数据。
管理表
默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive 会(或多 或少地)控制着数据的生命周期。Hive 默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定义的目录的子目录下。当 我 们删除一个管理表时,Hive 也会删除这个表中数据。管理表不适合和其他工具共享数据。
普通创建表
根据查询结果创建表(查询的结果会添加到新创建的表中)
根据已经存在的表结构创建表
create table if not exists student4 like student;
查询表的类型
hive (default)> desc formatted student2;
外部表
因为表是外部表,所有 Hive 并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删掉。
管理表和外部表的使用场景:
每天将收集到的网站日志定期流入 HDFS 文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过 SELECT+INSERT进入内部表。
?(例子):
分别创建部门和员工外部表,并向表中导入数据
创建部门表
创建员工表
查看创建的表
hive (default)> show tables;
向外部表中导入数据 导入数据
在这里我还是要推荐下我自己建的大数据学习交流qq裙: 957205962, 裙 里都是学大数据开发的,如果你正在学习大数据 ,小编欢迎你加入,大家都是软件开发党,不定期分享干货(只有大数据开发相关的),包括我自己整理的一份2018最新的大数据进阶资料和高级开发教程,欢迎进阶中和进想深入大数据的小伙伴
查询结果
hive (default)> select * from emp;
hive (default)> select * from dept;
查看表格式化数据
hive (default)> desc formatted dept;
分区表
分区表实际上就是对应一个 HDFS 文件系统上的独立的文件夹,该文件夹下是该分区 所有的数据文件。Hive 中的分区就是分目录,把一个大的数据集根据业务需要分割成小的 数据集。在查询时通过 WHERE 子句中的表达式选择查询所需要的指定的分区,这样的查 询效率会提高很多。
分区表基本操作
引入分区表(需要根据日期对日志进行管理)
创建分区表语法
加载数据到分区表中
查询分区表中数据
单分区查询
hive (default)> select * from dept_partition where month='201809';
多分区联合查询
增加分区,创建单个分区
hive (default)> alter table dept_partition
add partition(month='201810') ;
同时创建多个分区
hive (default)> alter table dept_partition add
partition(month='201811'),
partition(month='201812');
删除分区 ,删除单个分区
hive (default)> alter table dept_partition
drop partition (month='201810');
同时删除多个分区
hive (default)> alter table dept_partition drop
partition (month='201811'),
partition (month='201812);
查看分区表有多少分区
hive>show partitions dept_partition;
查看分区表结构
hive>desc formatted dept_partition;
分区表注意事项
创建二级分区表
正常的加载数据
加载数据到二级分区表中
查询分区数据
hive (default)> select * from dept_partition2
where month='201809' and day='13';
把数据直接上传到分区目录上,让分区表和数据产生关联的两种方式
方式一:上传数据后修复
查询数据(查询不到刚上传的数据)
hive (default)> select * from dept_partition2
where month='201812' and day='12';
执行修复命令
hive>msck repair table dept_partition2;
再次查询数据
hive (default)> select * from dept_partition2
where month='201812' and day='12';
方式二:上传数据后添加分区
执行添加分区
hive (default)> alter table dept_partition2 add partition(month='201812', day='11');
查询数据
hive (default)> select * from dept_partition2 where month='201812' and day='11';
方式三:上传数据后 load 数据到分区
在这里我还是要推荐下我自己建的大数据学习交流qq裙: 957205962, 裙 里都是学大数据开发的,如果你正在学习大数据 ,小编欢迎你加入,大家都是软件开发党,不定期分享干货(只有大数据开发相关的),包括我自己整理的一份2018最新的大数据进阶资料和高级开发教程,欢迎进阶中和进想深入大数据的小伙伴
修改表
重命名表
增加/修改/替换列信息
注:ADD 是代表新增一字段,字段位置在所有列后面(partition 列前),REPLACE 则是 表示替换表中所有字段。
实操案例
删除表
hive (default)> drop table dept_partition;
DML 数据操作
数据导入
向表中装载数据(Load)
1、load data:表示加载数据
2、local:表示从本地加载数据到 hive 表;否则从 HDFS 加载数据到 hive 表
3、inpath:表示加载数据的路径
4、into table:表示加载到哪张表
5、student:表示具体的表
6、overwrite:表示覆盖表中已有数据,否则表示追加
7、partition:表示上传到指定分区
实操案例
通过查询语句向表中插入数据(Insert)
查询语句中创建表并加载数据(As Select)
根据查询结果创建表(查询的结果会添加到新创建的表中)
create table if not exists student3
as select id, name from student;
创建表时通过 Location 指定加载数据路径
Import 数据到指定 Hive 表中
数据导出
Insert 导出
其他命令导出
还可以用Sqoop 导出,后面专门分享一篇关于Sqoop 导出的文章
清除表中数据(Truncate)
注意:Truncate 只能删除管理表,不能删除外部表中数据
hive (default)> truncate table student;
吐槽一下后台的编辑器,真是超级难用,真是有点恶心到我了,下次先在有道云笔记准备好再复制过来看看效果怎么样,还是支持Markdown的编辑器比较好用,还有一些小细节,SQL的显示问题,使我不得不将一部分SQL先在Sublime中写好然后以截图的方式放进来,而且图片还加了水印,以后的图片尽量去掉水印吧,挺影响视觉上的体验,包括字体、排版,以后的文章中都会优化,提升阅读体验。
在这里我还是要推荐下我自己建的大数据学习交流qq裙: 957205962, 裙 里都是学大数据开发的,如果你正在学习大数据 ,小编欢迎你加入,大家都是软件开发党,不定期分享干货(只有大数据开发相关的),包括我自己整理的一份2018最新的大数据进阶资料和高级开发教程,欢迎进阶中和进想深入大数据的小伙伴
这是Hive的第二部分,之后会更新Hive的查询、常用函数、压缩、存储、优化,作为Hive的一个系列。