目录
7.1Hive的配置与安装
7.1.1安装MySQL
(1)安装MySQL
(2)配置Mysql
7.1.2安装和配置Hive
(1)安装hive
(2)配置环境变量
(3)配置hive
(4)上传jar包
(5)启动hive
7.1.3远程连接虚拟机mysql
(1)开启虚拟机mysql的远程连接
7.2HIVE表
7.2.1创建HIve表
示例:
7.2.2导入数据
7.2.3表的分区与分桶
(1)分区
示例:
(2)分桶
示例:
7.2.4内部表与外部表
(1)内部表
(2)外部表
(3)区别
7.2.5导出数据
(1)导出数据到hdfs上
(2)导入到本地
7.2.6内置函数与自定义函数
在Facebook Jeff团队所构建的信息平台中,最庞大的组成部分是Apache Hive。Hive是一个构建在Hadoop上的数据仓库框架,是应Facebook每天产生的海量网络数据进行管理和机器学习的需求而产生和发展的。
7.1Hive的配置与安装
Hive有3种metastore的配置方式,分别是内嵌模式、本地模式和远程模式。这里我们以本地模式为例,介绍Hive的配置与安装,首先,本地模式需要Mysql作为Hive metastore的存储数据库,因此在安装Hive之前需要先安装MySQL
7.1.1安装MySQL
(1)安装MySQL
mkdir /usr/local/mysql #创建mysql的目录
yum -y install wget #安装wget
cd /usr/local/mysql #进入目录
wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm #下载mysql安装包
rpm -ivh "包名" #解压mysql安装包
yum -y install mysql-community-server #安装mysql服务
systemctl restart mysqld #重启mysql服务
(2)配置Mysql
grep "password" /war/log/mysqld.log #寻找mysql的初始密码,然后复制
进入mysql
mysql -u root -p #按enter
粘贴密码
set global validate_password_policy=0; #更改策略
set global validate_password_policy=LOW; #降低密码强度
set global validate_password_length=6; #设置密码长度为6位
alter user 'root'@'localhost' IDENTIFIED BY '123456'; #设置密码
exit; #退出mysql
7.1.2安装和配置Hive
(1)安装hive
mkdir /usr/local/hive #创建hive目录
拖拽文件至该文件夹
tar -zxvf apache-hive-1.2.2-bin.tar.gz #解压安装包
rm -rf apache-hive-1.2.2-bin.tar.gz #删除安装包
(2)配置环境变量
vim /etc/profile #编辑环境变量文件
添加以下代码
export HIVE_HOME=/usr/local/hive/apache-hive-1.2.2-bin
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin #在path中添加最后的HIVE_HOME
source /etc/profile #生效环境变量
(3)配置hive
进入apache-hive-1.2.2-bin/conf目录下
(1)新建文件hive-site.xml
vim hive-site.xml #在此文件添加下面代码
javax.jdo.option.ConnectionURL
jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true
JDBC connect string for a JDBC metastore
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
Driver class name for a JDBC metastore
javax.jdo.option.ConnectionUserName
root
username to use against metastore database
javax.jdo.option.ConnectionPassword
123456
password to use against metastore database
(2)配置hive-env.sh
cp hive-env.sh.template hive-env.sh #复制并更改名字
修改此文件第48行的HADOOP_HOME路径
(4)上传jar包
mkdir /usr/local/mysql #创建mysql的目录 yum -y install wget #安装wget cd /usr/local/mysql #进入目录 wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm #下载mysql安装包 rpm -ivh "包名" #解压mysql安装包 yum -y install mysql-community-server #安装mysql服务 systemctl restart mysqld #重启mysql服务
(2)配置Mysql
grep "password" /war/log/mysqld.log #寻找mysql的初始密码,然后复制
进入mysql
mysql -u root -p #按enter
粘贴密码
set global validate_password_policy=0; #更改策略
set global validate_password_policy=LOW; #降低密码强度
set global validate_password_length=6; #设置密码长度为6位
alter user 'root'@'localhost' IDENTIFIED BY '123456'; #设置密码
exit; #退出mysql
7.1.2安装和配置Hive
(1)安装hive
mkdir /usr/local/hive #创建hive目录
拖拽文件至该文件夹
tar -zxvf apache-hive-1.2.2-bin.tar.gz #解压安装包
rm -rf apache-hive-1.2.2-bin.tar.gz #删除安装包
(2)配置环境变量
vim /etc/profile #编辑环境变量文件
添加以下代码
export HIVE_HOME=/usr/local/hive/apache-hive-1.2.2-bin
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin #在path中添加最后的HIVE_HOME
source /etc/profile #生效环境变量
(3)配置hive
进入apache-hive-1.2.2-bin/conf目录下
(1)新建文件hive-site.xml
vim hive-site.xml #在此文件添加下面代码
javax.jdo.option.ConnectionURL
jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true
JDBC connect string for a JDBC metastore
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
Driver class name for a JDBC metastore
javax.jdo.option.ConnectionUserName
root
username to use against metastore database
javax.jdo.option.ConnectionPassword
123456
password to use against metastore database
(2)配置hive-env.sh
cp hive-env.sh.template hive-env.sh #复制并更改名字
修改此文件第48行的HADOOP_HOME路径
(4)上传jar包
(1)安装hive
mkdir /usr/local/hive #创建hive目录
拖拽文件至该文件夹
tar -zxvf apache-hive-1.2.2-bin.tar.gz #解压安装包
rm -rf apache-hive-1.2.2-bin.tar.gz #删除安装包
(2)配置环境变量
vim /etc/profile #编辑环境变量文件
添加以下代码
export HIVE_HOME=/usr/local/hive/apache-hive-1.2.2-bin
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin #在path中添加最后的HIVE_HOME
source /etc/profile #生效环境变量
(3)配置hive
进入apache-hive-1.2.2-bin/conf目录下
(1)新建文件hive-site.xml
vim hive-site.xml #在此文件添加下面代码
javax.jdo.option.ConnectionURL
jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true
JDBC connect string for a JDBC metastore
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
Driver class name for a JDBC metastore
javax.jdo.option.ConnectionUserName
root
username to use against metastore database
javax.jdo.option.ConnectionPassword
123456
password to use against metastore database
(2)配置hive-env.sh
cp hive-env.sh.template hive-env.sh #复制并更改名字
修改此文件第48行的HADOOP_HOME路径
(4)上传jar包
vim /etc/profile #编辑环境变量文件 添加以下代码 export HIVE_HOME=/usr/local/hive/apache-hive-1.2.2-bin PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin #在path中添加最后的HIVE_HOME source /etc/profile #生效环境变量
(3)配置hive
进入apache-hive-1.2.2-bin/conf目录下
(1)新建文件hive-site.xml
vim hive-site.xml #在此文件添加下面代码
javax.jdo.option.ConnectionURL
jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true
JDBC connect string for a JDBC metastore
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
Driver class name for a JDBC metastore
javax.jdo.option.ConnectionUserName
root
username to use against metastore database
javax.jdo.option.ConnectionPassword
123456
password to use against metastore database
(2)配置hive-env.sh
cp hive-env.sh.template hive-env.sh #复制并更改名字
修改此文件第48行的HADOOP_HOME路径
(4)上传jar包
将要用的jar包传送到hive的lib文件下(这个文件我回头上传到我的资源上)
(5)启动hive
启动一:直接在根目录下输入:hive shell
启动二:进入hive的bin目录下输入./hiveserver2,重新启动一个客户端,在bin目录下输入:./beeline -u jdbc:hive2://localhost:10000 -n root
7.1.3远程连接虚拟机mysql
(1)开启虚拟机mysql的远程连接
首先进入mysql
mysql -u root -p123456
进入之后输入
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; #开启远程连接
FLUSH PRIVILEGES #刷新
(2)在外部开启sqlyog或者navicat连接就行了
首先进入mysql mysql -u root -p123456 进入之后输入 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; #开启远程连接 FLUSH PRIVILEGES #刷新
(2)在外部开启sqlyog或者navicat连接就行了
7.2HIVE表
HIVE是一个数据仓库,它可以将结构化的数据文件映射为一张数据库表,并具有SQL语言的查询功能,在这里需要再次强调的是对于数据仓库来说,往往存放的是历史数据,它的作用是完成查询分析,用于企业高层决策参考,往往不会完成单条记录的增删改操作
Hive表的创建语法与传统的关系型数据库类似,但是Hive的类型可以更加复杂,比如可以是数组类型和map类型。
7.2.1创建HIve表
首先我们创建一张表
CREATE TABLE person(id INT,name STRING,age INT,fav ARRAY,addr MAP ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' COLLECTION ITEMS TERMINATED BY '-' MAP KEYS TERMINATED BY ':' STORED AS TEXTFILE;
上述语句中,ROW FORMAT DELIMITED FIELDS TERMINATED BY 't' 是定义每一个字段的分隔符,这里的’t‘表示以Tab键作为分隔符分隔每行字段。
COLLECTION ITEMS TERMINATED BY '-'是定义集合类型中每个对象的分隔符fav字段是String类型的数组,这里定义以’-‘为分隔符,分隔每个字符串
MAP KEYS TERMINATED BY '-'是定义MAP类型键值对的分隔符,这里以’:‘为分隔符,分隔键值。
STORED AS TEXTFILE是定义这张表使用的数据文件格式,这里指定为txt类型
示例:
(1)创建表
CREATE TABLE person(id INT,name STRING,age INT,fav ARRAY,addr MAP ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' COLLECTION ITEMS TERMINATED BY '-' MAP KEYS TERMINATED BY ':' STORED AS TEXTFILE; #创建一个名为person内部表
(2)写数据文件 (我写在我的’/opt/data/’目录下的)
1 rod 18 study-game-driver std_addr:beijing-work_addr:shanghai 2 tom 21 study-game-driver std_addr:beijing-work_addr:beijing 3 jck 33 study-game-driver std_addr:beijing-work_addr:shenzhen 数据字段的分隔使用的空格
(3)写入表中
LOAD DATA LOCAL INPATH '/opt/data/person.txt' INTO TABLE person;
(4)查看表
SELECt * FROM person;
7.2.2导入数据
方式一:导入数据的一种方式 手动用hdfs命令,将文件表放入表目录汇中
Hadoop fs -put /opt/b.txt /user/hive/warehouse/表名
方式二:在hive的交互式shell中hive命令来导入本地数据到表目录中
Load data local inpath ‘/opt/b.txt’ into table 表名
方式三:用hive命令导入hdfs中的数据文件到目录
Load data inpath ‘/access.log.2017-08-09.log’ into table 表名 partition(dt=’20170809’)
注意:导本地文件和导hdfs文件的区别:本地文件导入表:复制;hdfs文件。每个人路径不一样大家照着自己的路径来。
7.2.3表的分区与分桶
Hive中存放的数据往往是以PB为单位的庞大数据集,海量的数据需要耗费大量的时间去处理,若是每次查询都对全部数据进行检索,效率会极为低下。而且在许多场景下,我们并不需要对全部数据进行检索,因此引入分区和分桶的方法减少每一次扫描总数据量,这种做法可以显著改善性能
(1)分区
把数据依照单个或多个列进行分区,通常按照时间、地区进行分区。比如一张统计了全国各地一年来不同时刻温度的表,可以按照地域来分区,也可以按照时间来分区,甚至可以将时间和地域都当作分区条件。为来达到性能表现得一致性,对不同列得划分应该让数据尽可能分布均匀。最好情况下,分区得划分条件总是能够应对where语句得部分查询条件。
CREATE TABLE person2(id INT,name STRING,age INT,fav ARRAY,addr MAP ) PARTITIonED BY(dt STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' COLLECTION ITEMS TERMINATED BY '-' MAP KEYS TERMINATED BY ':' STORED AS TEXTFILE;
注意:分区字段不能是表定义中的已存在字段
示例:
#创建分区表
CREATE TABLE person2(id INT,name STRING,age INT,fav ARRAY,addr MAP) PARTITIonED BY(dt STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' COLLECTION ITEMS TERMINATED BY '-' MAP KEYS TERMINATED BY ':' STORED AS TEXTFILE;
#导入数据
LOAD DATA LOCAL INPATH '/opt/data/person.txt' INTO TABLE person PARTITION(dt='20180315')
#查询数据
SELECt addr['work_addr'] FROM person2 WHERe dt='20180315';
(2)分桶
分桶是相对分区进行更细粒度的划分。在分区数量过于庞大以至于可能导致文件系统崩溃时,我们就需要使用分桶来解决问题。
分桶将整个数据内容按照某列属性值的Hash值进行区分。比如,如果要按照ID属性分为4个桶,就是对ID属性值的Hash值对4取模,按照取模结果对数据分桶。例如,取模为1则放在一个文件中,取模为2则放在2个文件中。
CREATE TABLE person3(id INT,name STRING,age INT,fav ARRAY示例:,addr MAP ) PARTITIonED BY (dt STRING) CLUSTERED BY (id) INTO 4 BUCKETS ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' COLLECTION ITEMS TERMINATED BY '-' MAP KEYS TERMINATED BY ':' STORED AS TEXTFILE;
#创建表 CREATE TABLE person3(id INT,name STRING,age INT,fav ARRAY,addr MAP ) PARTITIonED BY (dt STRING) CLUSTERED BY (id) INTO 4 BUCKETS ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' COLLECTION ITEMS TERMINATED BY '-' MAP KEYS TERMINATED BY ':' STORED AS TEXTFILE; #插入数据 LOAD DATA LOCAL INPATH '/opt/data/person.txt' INTO TABLE person3 PARTITION(dt='20180315'); #查询数据 SELECt * FROM person3 TABLESAMPLE(BUCKET 1 OUT OF 4 ON id); #搜索第一个桶里面的内容。
7.2.4内部表与外部表
与传统关系型数据库不同,Hive创建的表分为外部表和内部表,对于内部表来说,在创建的时候会把数据移动到数据仓库所指向的位置;如果是外部表,则仅仅记录数据所在的位置。
同时,对于内部表来说,在删除的时候会将元数据和数据一起删除,而外部表仅仅是删除了元数据,真正的数据不会删除。所以,如果在共享资源数据的情况下,可以选择使用外部表;如果是仅仅hive内部使用,则可以使用内部表。
(1)内部表
创建内部表:
CREATE TABLE table_i(id INT,name STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
(2)外部表
创建外部表:外部表创建的时候LOCATION 参数可以指定位置,这个指定了位置和不指定位置会有些许变化。
CREATE EXTERNAL TABLE table_o1(id INT,name STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ; #此命令会生成文件 且删除表的时候 HDFS上目录下的文件不被删除
CREATE EXTERNAL TABLE table_o2(id INT,name STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/opt/data ; #此命令不会在HDFS /opt/data 生成文件,删除表也就删除了
(3)区别
咱们创建了内部表数据之后,会在"/user/hive/warehouse/数据库名"下生成一个文件,并且在表删除后该文件也被删除。
外部表呢,在不指定LOCATION参数的情况下也会在"/user/hive/warehouse/数据库名"下生成一个文件,但是,当我们删除了该表的时候,我们会发现这个路径下的文件还在。当指定了LOCATION参数,我们会发现HDFS指定的路径下没有生成文件。
① 内部表的目录在hive的仓库目录中VS外部表的目录由用户指定
② drop一个内部表时:hive会清除相关元数据,并删除表数据目录
③ drop一个外部表时:hive只会清除相关元数据
7.2.5导出数据
(1)导出数据到hdfs上
下图是我person3表的内容
导入到HDFS上:
INSERT OVERWRITE DIRECTORY '/hive_out' ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' SELECT * FROM person3;
进行查看:
(2)导入到本地
导入到本地
INSERT OVERWRITE LOCAL DIRECTORY '/opt/data/person_out' ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' SELECt * FROM person3;
查看:
7.2.6内置函数与自定义函数
Hive中包含很多内置的函数,如果这些函数不能满足我们的业务场景时,可以通过编写用户自定义函数(User-Defined Function,UDF)来实现,并在hive中调用,
UDF函数有3中类型,分别是UDF、UDAF和UDTF
1.UDF函数的特点时作用于单条数据,并且输出一个数据行。大多数的函数如字符串函数、日期函数等都属于这一类。
2.UDAF函数可以接收多个数据输入,同时输出一个数据行,比如COUNT、MIN、MAX,这类函数。
3.UDTF函数的特点时作用域单个数据行,同时产生多个输出数据行。



