初学Hadoop——Hive命令行客户端使用

一、Hive简介

Hive是一个基于HDFS和MapReduce的分布式数据仓库系统,以表的形式管理用户数据,用户只需要编写HQL语句就能够利用MR对存放在HDFS上的数据进行计算(Hive会将HQL语句自动转换为MR作业,提交给MR执行),降低了学习成本。此实验指导用户如何使用Hive提供的命令行客户端连接HiveServer,并通过HQL语句实现内部表、外部表、分区分桶表的创建、删除、修改、数据的导入导出、数据的查询等操作。

二、 Hive的安装

(1) 下载并解压hive源程序

直接在虚拟机中进入网址:hive源程序网址
下载Hive源程序
在这里插入图片描述

(2) 解压源程序

在终端输入下面命令:

sudo tar -zxvf ./apache-hive-1.2.1-bin.tar.gz -C /usr/local  # 解压到/usr/local中
cd /usr/local/
sudo mv apache-hive-1.2.1-bin hive       # 将文件夹名改为hive
sudo chown -R hadoop: hadoop hive            # 修改文件权限

(3) 配置环境变量

为了方便使用,把hive命令加入到环境变量中去,使用vim编辑器打开.bashrc文件,命令如下:

vim ~/.bashrc

在这里插入图片描述

加入的内容为:

export HIVE_HOME=/usr/local/hive 
export PATH=$PATH:$HIVE_HOME/bin 
export HADOOP_HOME=/usr/local/Hadoop

保存退出后,运行如下命令使配置立即生效:

source ~/.bashrc

在这里插入图片描述

(4) 修改/usr/local/hive/conf下的hive-site.xml

执行如下命令:

cd /usr/local/hive/conf
mv hive-default.xml.template hive-default.xml

上面命令是将hive-default.xml.template重命名为hive-default.xml;然后,使用vim编辑器新建一个配置文件hive-site.xml,命令如下:

cd /usr/local/hive/conf
vim hive-site.xml

在这里插入图片描述

三、 安装并配置mysql

采用MySQL数据库保存Hive的元数据,而不是采用Hive自带的derby来存储元数据。

(1) 下载安装MySQL

使用以下命令即可进行mysql安装,注意安装前先更新一下软件源以获得最新版本:

sudo apt-get update  #更新软件源
sudo apt-get install mysql-server  #安装mysql

(2) 启动和关闭mysql服务器

service mysql start
service mysql stop

(3) 确认是否启动成功,mysql节点处于LISTEN状态表示启动成功

sudo netstat -tap |grep mysql

在这里插入图片描述

(4) 进入mysql shell界面

mysql -u root -p

在这里插入图片描述

四、 MySQL常用操作

MySQL中每个命令后都要以英文分号;结尾。

(1) 显示数据库

show databases;

在这里插入图片描述

(2) 显示数据库中的表

use mysql; //打开库,对每个库进行操作就要打开此库
showtables;

在这里插入图片描述
(3) 显示数据表的结构

describe 表名;

在这里插入图片描述
(4) 显示表中的记录

select * from 表名;

例如:显示mysql库中user表中的纪录。所有能对MySQL用户操作的用户都在此表中。

select * from user;

在这里插入图片描述
在这里插入图片描述
(5) 建库

create database 库名;

在这里插入图片描述
(6) 建表

use 库名;
create table 表名 (字段设定列表)

例如:在刚创建的aaa库中建立表person,表中有id(序号,自动增长),xm(姓名),xb(性别),csny(出身年月)四个字段

use aaa;
create table person (id int(3) auto_increment not null primary key, xm varchar(10),xb varchar(2),csny date);

在这里插入图片描述

可以用describe命令察看刚建立的表结构:

describe person;

在这里插入图片描述

(7) 增加记录

例如:增加几条相关纪录。

mysql>insert into person values(001,’张三’,’男’,’1997-01-02′);
mysql>insert into person values(002,’李四’,’女’,’1996-12-02′);

注意:字段的值(’张三’,’男’,’1997-01-02’)是使用两个英文的单撇号包围起来,后面也是如此。

因为在创建表时设置了id自增,因此无需插入id字段,用null代替即可。

在这里插入图片描述

(8) 修改纪录

Update 表名 set

例如:将张三的出生年月改为1971-01-10

update person set csny=’1971-01-10′ where xm=’张三’;

(9) 删除纪录

delete from 表名 where

例如:删除张三的纪录。

delete from person where xm=’张三’;

(10) 删库和删表

drop database 库名;
drop table 表名;

(11) 查看mysql版本

在mysql5.0中命令如下:

show variables like ‘version’;

或:

select version();

五、 下载mysql jdbc 包

下载地址:下载mysql jdbc 包地址

tar -zxvf mysql-connector-java-5.1.40.tar.gz   #解压
cp mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar /usr/local/hive/lib 
#将mysql-connector-java-5.1.40-bin.jar拷贝到/usr/local/hive/lib目录下

六、启动并登陆mysql shell

service mysql start #启动mysql服务
mysql -u root -p  #登陆shell界面

在这里插入图片描述

七、新建Hive数据库

create database hive;
#这个hive数据库与hive-site.xml中localhost:3306/hive的hive对应,用来保存hive元数据

在这里插入图片描述

配置mysql允许hive接入:

grant all on *.* to hive@localhost identified by 'hive'; 
#将所有数据库的所有表的所有权限赋给hive用户,后面的hive是配置hive-site.xml中配置的连接密码
flush privileges;  #刷新mysql系统权限关系表

在这里插入图片描述

启动hive:

启动hive之前,请先启动hadoop集群:

start-all.sh #启动hadoop
hive  #启动hive

在这里插入图片描述

八、 使用Hive

(1) 预先准备工作

在HDFS上创建Hive所需路径/tmp和/user/hive/warehouse

hadoop fs -mkdir /tmp
hadoop fs -mkdir /user/hive/warehouse

在这里插入图片描述
在这里插入图片描述

修改上述路径的访问权限,使用户组具有写入权限:

hadoop fs -chmod g+w /tmp
hadoop fs -chmod g+w /user/hive/warehouse

在这里插入图片描述

启动Hive:

在这里插入图片描述
在这里插入图片描述

退出Hive:

exit

(2) hive常用命令

①进入hive数据库

需要先启动Hadoop:

Start-all.Sh

再进入hive数据库:

hive

在这里插入图片描述
在这里插入图片描述

②查看hive中的所有数据库

show databases;

在这里插入图片描述

③使用数据库

use 数据库名;

在这里插入图片描述

④查看所有的表

show tables;

在这里插入图片描述
在这里插入图片描述

⑤查询表结构

desc 表名;

在这里插入图片描述

⑥查询表数据

select * from 表名;

在这里插入图片描述

⑦创建数据库

CREATE SCHEMA userdb;

在这里插入图片描述

⑧验证数据库表

SHOW DATABASES;

在这里插入图片描述

⑨删除数据库

DROP DATABASE IF EXISTS userdb;
DROP SCHEMA userdb;

在这里插入图片描述

⑩创建表employee

create table if not exists employee (eid int,name String,salary String,destination String)
comment 'employee details'
ROW FORMAT DELIMITED   
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;

在这里插入图片描述

(3)Hive基本数据类型

Hive支持基本数据类型和复杂类型, 基本数据类型主要有数值类型(INT、FLOAT、DOUBLE ) 、布尔型和字符串, 复杂类型有三种:ARRAY、MAP 和 STRUCT。

a.基本数据类型

TINYINT:1个字节
SMALLINT:2个字节
INT:4个字节
BIGINT:8个字节
BOOLEAN:TRUE/FALSE
FLOAT:4个字节,单精度浮点型
DOUBLE:8个字节,双精度浮点型STRING 字符串

b.复杂数据类型
ARRAY:有序字段
MAP:无序字段
STRUCT: 一组命名的字段

(4)常用的HiveQL操作命令

Hive常用的HiveQL操作命令主要包括:数据定义、数据操作。

① 数据定义:主要用于创建修改和删除数据库、表、视图、函数和索引。

创建、修改和删除数据库:

create database if not exists hive;       
#创建数据库

show databases;                           
#查看Hive中包含数据库

show databases like 'h.*';                
#查看Hive中以h开头数据库

describe databases;                       
#查看hive数据库位置等信息

alter database hive set dbproperties;     
#为hive设置键值对属性

use hive;                                 
#切换到hive数据库下

drop database if exists hive;             
#删除不含表的数据库

drop database if exists hive cascade;     
#删除数据库和它中的表

注意:
除 dbproperties属性外,数据库的元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置,没有办法删除或重置数据库属性。

创建、修改和删除表:



create table if not exists hive.usr(
      name string comment 'username',
      pwd string comment 'password',
      address struct<street:string,city:string,state:string,zip:int>,
      comment 'home address',
      identify map<int,tinyint> comment 'number,sex') 
      comment 'description of the table'         
      tblproperties('creator'='me','time'='2016.1.1'); 


#创建外部表

create external table if not exists usr2(
      name string,
      pwd string,
      address struct<street:string,city:string,state:string,zip:int>,
      identify map<int,tinyint>) 
      row format delimited fields terminated by ','    
      location '/usr/local/hive/warehouse/hive.db/usr';


#创建分区表

create table if not exists usr3(
      name string,
      pwd string,
      address struct<street:string,city:string,state:string,zip:int>,
      identify map<int,tinyint>) 
      partitioned by(city string,state string);

视图和索引的创建、修改和删除:

create view view_name as....;                #创建视图
alter view view_name set tblproperties();   #修改视图

因为视图是只读的,所以 对于视图只允许改变元数据中的 tblproperties属性。

#删除视图
drop view if exists view_name;

② 用户自定义函数:

在新建用户自定义函数(UDF)方法前,先了解一下Hive自带的那些函数。show functions; 命令会显示Hive中所有的函数名称:
在这里插入图片描述
若想要查看具体函数使用方法可使用:describe function 函数名:
在这里插入图片描述

③ 数据操作

主要实现的是将数据装载到表中(或是从表中导出),并进行相应查询操作,与SQL语言类似。

向表中装载数据:

这里我以只有两个属性的简单表为例来介绍。首先创建表stu和course,stu有两个属性id与name,course有两个属性cid与sid。

create table if not exists hive.stu(id int,name string) 
row format delimited fields terminated by '\t';

在这里插入图片描述
在这里插入图片描述

create table if not exists hive.course(cid int,sid int) 
row format delimited fields terminated by '\t';

在这里插入图片描述

向表中装载数据有两种方法:从文件中导入和通过查询语句插入。

a.从文件中导入:

假如这个表中的记录存储于文件stu.txt中,该文件的存储路径为/usr/local/hadoop/examples/stu.txt,内容如下:

在这里插入图片描述

把这个文件中的数据装载到表stu中,操作如下:

load data local inpath '/usr/local/hadoop/examples/stu.txt' overwrite into table stu;

如果stu.txt文件存储在HDFS上,则不需要 local 关键字。
在这里插入图片描述

b.通过查询语句插入:

使用如下命令,创建stu1表,它和stu表属性相同,我们要把从stu表中查询得到的数据插入到stu1中:

create table stu1 as select id,name from stu;

在这里插入图片描述

上面是创建表,并直接向新表插入数据;若表已经存在,向表中插入数据需执行以下命令:

insert overwrite table stu1 select id,name from stu where(条件);

这里关键字overwrite的作用是替换掉表(或分区)中原有数据,换成into关键字,直接追加到原有内容后。

④ 从表中导出数据

a. 可以简单拷贝文件或文件夹:

hadoop  fs -cp source_path target_path;

a. 写入临时文件:

insert overwrite local directory '/usr/local/hadoop/tmp/stu' select id,name from stu;

⑤ 查询操作

和SQL的查询完全一样,这里不再赘述。主要使用select…from…where…等语句,再结合关键字group
by、having、like、rlike等操作。

这里简单介绍一下SQL中没有的case…when…then…句式、join操作和子查询操作。

case…when…then…句式和if条件语句类似,用于处理单个列的查询结果,语句如下:



select id,name,
case 
when id=1 then 'first' 
when id=2 then 'second'
else 'third'
end from stu

在这里插入图片描述

⑥ 连接

连接(join)是将两个表中在共同数据项上相互匹配的那些行合并起来,
HiveQL 的连接分为内连接、左向外连接、右向外连接、全外连接和半连接 5 种。

a. 内连接(等值连接)

内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。

首先,我们先把以下内容插入到course表中:
在这里插入图片描述
在这里插入图片描述

查询stu和course表中学号相同的所有行,命令如下:

select stu.*, course.* from stu join course on(stu .id=course .sid);

在这里插入图片描述

b. 左连接

左连接的结果集包括“LEFT OUTER”子句中指定的左表的所有行, 而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行, 则在相关联的结果集中右表的所有选择列均为空值,命令如下:

select stu.*, course.* from stu left outer join course on(stu .id=course .sid);

在这里插入图片描述

c. 右连接

右连接是左向外连接的反向连接,将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。命令如下:

select stu.*, course.* from stu right outer join course on(stu.id=course .sid);

在这里插入图片描述

d. 全连接

全连接返回左表和右表中的所有行。当某行在另一表中没有匹配行时,则另一个表的选择列表包含空值。如果表之间有匹配行,则整个结果集包含基表的数据值。命令如下:

select stu.*, course.* from stu full outer join course on(stu .id=course .sid);

在这里插入图片描述

e. 半连接

半连接是 Hive 所特有的, Hive 不支持 in操作,但是拥有替代的方案; left semi join, 称为半连接, 需要注意的是连接的表不能在查询的列中,只能出现在 on 子句中。命令如下:

select stu.* from stu left semi join course on(stu .id=course .sid);

在这里插入图片描述

⑦ 子查询

标准 SQL 的子查询支持嵌套的 select 子句,HiveQL对子查询的支持很有限,只能在from引导的子句中出现子查询。

猜你喜欢

转载自blog.csdn.net/qq_45154565/article/details/109194522