一、课前准备
●安装并配置好Hadoop, 保证Hadoop集群是正常启动的。
●在Hive的安装目录下启动,执行bin/hive。
二、Hive简介
1.Hive是什么?
●基于Hadoop的开源数据仓库工具,用于存储和处理海量结构化数据
●Hive把HDFS中结构化的数据映射成表。
●Hive通过把HiveSQL进行解析和转换, 最终生成-系列基于hadoop的map/reduce任务, 通过执
行这些任务完成数据处理。
2.Hive与传统数据库的比较
Hive的优势
●把海量数据存储于hadoop文件系统,而不是数据库,但提供了一套类数据库的数据存储和处理
机制,并采用HQL (类 SQL )语言对这些数据进行自动化处理
●不仅提供了- -个熟悉SQL的用户所能熟悉的编程模型,还消除了大量的通用代码,甚至那些有时是
不得不使用ava编写的令人棘手的代码
●学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门]的MapReduce应用,十分适合数据仓库的统计分析,应用开发灵活而高效
三、Hive数据定义与操作
1.数据库相关
创建数据库
CREATE (DATABASE/SCHEMA) [IF NOT EXISTS] da tabase_ name
[COMMENT database_ comment]
[LOCATION hdfs_ path]
[WITH DBPROPERTIES (prope rty_ _name=property value, ...)];
案例演示:
create database if not exists studyBase;
拓展1:在Hi ve中使用Hadoop的dfs命令
hive> dfs -1s /;
拓展2:在Hi ve中查看本地文件系统
hive> !1s /opt/module;
查看数据库信息desc database extended数据库名;
删除数据库.
drop database if exists studyBase;
drop database if exists studyBase cascade ;强制删除数据库
修改数据库.
ALTER (DATABASE/SCHEMA) database_ name SET LOCATION hdfs_ path;
2.数据表相关
创建数据表
create [externa1] table if not exists表名
(列名数据类型[comment 本列注释],...)
[comment表注释]
[partitioned by (列名数据类型[comment 本列注释] .. .)]
[clustered by(列名,列名,..]
[sorted by (列名[asc| desc],...)] info num_ buckets buckets]
[row format row_ _format]
[stored as file_ format]
[1ocati on hdfs_ path]
[tb1properties (property_ name=property_ _value,...)]
[as select_ statement]
说明:
①externa1表示创建外部表; hive在创建内 部表时,会将数据移动到数据仓库指向的路径;若创建外部表,
仅记录数据所在的路径,不对数据的位置做任何改变
②partitioned by表示创建分区表
③clustered by创建分桶表
④sorted by不常用
⑤row format delimited [fields terminated by char] [collection i tems terminated
by char] [map keys terminated by char] [line terminated by char]
⑥stored as指定文件存储类型(sequencefile二进制文件、textfile文本文件、 rcfile列式 存储格式)
olocati on指定表在hdfs.上的存储位置
⑧like允许用户复制现有的表结构,但是不复制数据
⑨as后跟查询语句,根据查询结果创建表
查看数据表结构
desc formatted table_ name ;
内部表和外部表的区别
目前所创建的表都是所谓的管理表,有时也被称为内部表,因为这种表,Hive会 (或多或少地)控制着数据的
生命周期。当删除- -个管理表时,Hive也会删除这个表中数据,管理表不方便和其他工作共享数据。
1.用关键字externa1说明
2.指定外部表存放的数据的路径
3.如果不指定外部表的存放路径,Hive将在HDFS上的/user/hive/warehouse文件夹下以外部表名创建
一一个文件夹,并且将属于这个表的数据都存放在这里
4.当删除一个外部表时,只会删除表的元数据信息,而不会删除数据。
5.在生产中一般创建外部表来存储数据
修改表
修改表名
ALTER TABLE 1 og_ mes sages RENAME TO logmsgs;
向表中添加列
ALTER TABLE 1og_ messages ADD COLUMNS (
app_ name
STRING
COMMENT
Application name
session_ _id LONG
COMMENT
” The
current
sessi on
id');
修改列名
ALTER TABLE table_ name change column_ name new_ .co 1 umn_ _name new_ type ;
删除表
drop table if exists table_ name;
清空表.
truncate table employee;
分区表
hive中有分区表的概念,我们可以看到分区具重要性能优势,而且分区表还可以将数据以一种符
合逻辑的方式进行组织,比如分层存储分区表分别有静态分区和动态分区,那么它们有什么区别
呢?静态分区与动态分区的主要区别在于静态分区是手动指定,而动态分区是通过数据来进行判
断。静态分区的列是在编译时期,通过用户传递列名来决定的;动态分区只有在SQL执行
静态分区
create table test
(name string,age int)
partitioned by (country string)
row format delimited fields terminated by '\t'
lines terminated by '\n'
stored as textfi le;
在一个分区表执行hivesq1,除非where语句中包含分区字段过滤条件来显示数据范围,否则不允许执行。换
句话说,就是用户不允许扫描所有的分区。进行这个限制的原因是,通常分区表都拥有非常大的数据集,而且
数据增加迅速。如果没有进行分区限制的查询可能会消耗令人不可接受的巨大资源来处理这个表。
向分区表中插入数据
insert into table test parti tion(country="china") va lues(" zhangsan",1) ;
查询分区表的数据
select * from test where country="china";
删除分区
alter table test drop partition (country="china");
动态分区
set hive . exec . dynamic. partition=true; (可通过这个语句查看: set
hive . exec . dynami C. partition;)
set hive . exec . dynamic. partition . mode=nonstrict;
SET hive . exec .max . dynamic . parti tions=100000; (如果自动分区数大于这个参数,将会报错)
SET hive . exec .max . dynamic . parti tions . pernode=100000;
如何创建分区表?
create table if not exists user_ _trade (
user_ name string,
pi ece
int,
price
doub1e,
pay_ _amount doub1e,
goods_ category string,
pay_ time bigint)
partitioned by (dt string)
row format delimited fie1ds terminated by '\t';
怎么向分区表中添加数据?
显示分区数
show partitions order_ part;
查询分区表中的数据
select * from user_ trade limit 6;
严格模式:
set hive . mapred. mode=strict;
select * from user_ .trade limit 6;
select * from user_ trade where dt= ' 2017-01-12' ;
数据的导入和导出
1.从本地导入到表中
load data 1ocal inpath '本地路径’overwrite into table sogou
[partition (partco11=va1.,....)];
2.从HDFS导入到表中
load data inpath 'HDFS 上的路径’into table 表名[partition(partcol1=va1.....)];
3.将Hi ve表中的数据导出到本地
insert overwrite 1ocal di rectory ' 本地路径’查询语句;
4.将Hi ve表中的数据导出到HDFS
insert overwrite di rectory ' HDFS路径’查询语句;