步骤一:安装部署Zookeeper,Hadoop分布式环境
本实验采用hadoop 2.7.1部署三台大数据处理平台环境。如图1-2所示
图1-2 hadoop分布式环境
注意:各主机中的操作系统版本需保持一致。安装过程中都在hadoop用户下,本教材中密码统一采用:password(注意大小写)
步骤二:解压安装文件
使用tar命令解压安装包到指定目录,并重命名。
[root@master ~]# cd /opt/software/
[root@master software]# tar -zxvf apache-hive-2.0.0-bin.tar.gz -C /usr/local/src/ # 解压到统一安装目录
[root@master software]# cd /usr/local/src
[root@master src]# mv /usr/local/src/apache-hive-2.0.0-bin /usr/local/src/hive
[root@master src]# chown -R hadoop:hadoop hive
编辑/etc/profile文件。
[root@master src]# cd
[root@master ~]# vi /etc/profile
将以下配置信息添加到/etc/profile文件的末尾。
# set Hive environment
export HIVE_HOME=/usr/local/src/hive # Hive安装目录
export PATH=$HIVE_HOME/bin:$PATH # 添加将Hive的bin目录
export HIVE_CONF_DIR=$HIVE_HOME/conf #Hive的环境变量
执行source /etc/profile命令,使配置的环境变量在系统全局范围生效。
[root@master ~]# source /etc/profile
以上命令只需要在hive安装的节点操作,本文在master主节点进行Hive部署
实验任务二:MySQL安装与启动
步骤一:卸载MariaDB
先查看一下系统上的mariadb
[root@master ~]# rpm -qa | grep mariadb
mariadb-libs-5.5.52-2.el7.x86_64
然后卸载
[root@master ~]# rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64
ps:
rpm -qa 列出所有已安装软件包
rpm -e packagename 删除软件包
rpm -e --nodeps packagename 强制删除软件和依赖包
rpm -q 包名 查询包是否安装
rpm -ivh 包名 安装软件包
步骤二:使用rpm安装mysql
安装的顺序为:
[root@master ~]# cd /opt/software/mysql-5.7.18
[root@master mysql-5.7.18]# rpm -ivh mysql-community-common-5.7.18-1.el7.x86_64.rpm
[root@master mysql-5.7.18]# rpm -ivh mysql-community-libs-5.7.18-1.el7.x86_64.rpm
[root@master mysql-5.7.18]# rpm -ivh mysql-community-client-5.7.18-1.el7.x86_64.rpm
[root@master mysql-5.7.18]# rpm -ivh mysql-community-server-5.7.18-1.el7.x86_64.rpm
再通过#rpm -qa | grep mysql检查mysql安装情况
[root@master mysql-5.7.18]# vi /etc/my.cnf
#已有配置进行修改,没有的需要新增
default-storage-engine=innodb
innodb_file_per_table
collation-server=utf8_general_ci
init-connect='SET NAMES utf8'
character-set-server=utf8
启动mysql服务和查看其状态
[root@master mysql-5.7.18]# systemctl start mysqld
[root@master mysql-5.7.18]# systemctl status mysqld
[root@master mysql-5.7.18]# cat /var/log/mysqld.log | grep password
得到MySQL初始密码:
[root@master mysql-5.7.18]# mysql_secure_installation #重新设定密码和配置
设定密码要符合安全规则Password123$
注:允许远程连接设定为n,表示允许远程连接,其它设定为y
[root@master mysql-5.7.18]# mysql -uroot -pPassword123$
步骤三:新建Hive用户与元数据
在MySQL中新建名称为:hive_db的数据库存储Hive元数据。并新建hive用户,密码为Password123$,同时赋予所有权限。
mysql>create database hive_db;
mysql>create user hive identified by 'Password123$';
mysql>grant all privileges on *.* to hive@'%' identified by 'Password123$' with grant option ;
mysql>grant all privileges on *.* to 'root'@'%'identified by 'Password123$' with grant option;
mysql>flush privileges;
create database hive_db:新建hive_db数据库作为Hive的元数据存储地址。
create user hive identified by 'Password123$':创建Hive访问用户,用户名为hive,密码为hive。
grant all privileges on *.* to hive@'%' identified by 'Password123$' with grant option:grant 权限1,权限2,...权限n on 数据库名称.表名称 to 用户名@用户地址。赋予hive用户对所有数据库所有表的所有权限且任何地址都能建立连接“%”,并具有授予权。
flush privileges :刷新MySQL的系统权限相关表。
赋予hive用户对所有数据库所有表的所有权限且任何地址都能建立连接“%”,并具有授予权。
图1-6 创建Hive用户操作MySQL
实验任务三:配置Hive参数
步骤一: 配置hive-site.xml
复制源文件hive-default.xml.template并修改为hive-site.xml。修改对应参数的值。
[root@master ~]# su - hadoop
[hadoop@master ~]$ cp /usr/local/src/hive/conf/hive-default.xml.template /usr/local/src/hive/conf/hive-site.xml
[hadoop@master ~]$ vi /usr/local/src/hive/conf/hive-site.xml
<configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://master:3306/hive_db?createDatabaseIfNotExist=true</value> </property> <!--mysql用户名--> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value>
</property>
<!--mysql中hive用户密码--> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>Password123$</value> </property> <!--mysql驱动--> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>hive.downloaded.resources.dir</name> <value>/usr/local/src/hive/tmp</value> </property> <property> <name>hive.exec.local.scratchdir</name> <value>/usr/local/src/hive/tmp/${hive.session.id}_resources</value> </property> <property> <name>hive.querylog.location</name> <value>/usr/local/src/hive/tmp</value> </property> <property> <name>hive.server2.logging.operation.log.location</name> <value>/usr/local/src/hive/tmp/operation_logs</value> </property> <property> <name>hive.server2.webui.host</name> <value>master</value> </property> <property> <name>hive.server2.webui.port</name> <value>10002</value> </property> </configuration>
javax.jdo.option.ConnectionURL: JDBC连接字符串,默认为自带的metastore_db数据库,现以MySQL作为元数据存储地址,需建立JDBC连接,且hive_db处为实验二中创建的MySQL数据库,存储元数据。
javax.jdo.option.ConnectionUserName:连接MySQL的hive操作用户,实验二创建。
javax.jdo.option.ConnectionPassword:连接MySQL的hive操作用户密码,实验二创建。
javax.jdo.option.ConnectionDriverName:配置数据库连接驱动。
hive.downloaded.resources.dir:远程资源下载的临时目录。
hive.server2.webui.host:hiveserver2 WebUI页面访问地址。
hive.server2.webui.port: hiveserver2 WebUI页面访问端口。
除此之外,Hive默认配置文件为hive-default.xml.template。若用户没有对相关配置参数进行修改,Hive将读取默认配置文件参数进行启动,其他重要配置信息如:
hive.metastore.warehouse.dir:HDFS上存储配置数据仓库的目录。
hive.exec.scratchdir:hive用来存储不同阶段的map/reduce的执行计划的目录,同时也存储中间输出结果。
其他详细参数可参照官方配置文件或者hive-default.xml.template下<description>标签下的描述信息,本文使用默认参数,既需要在HDFS上新建Hive的数据仓库文件夹,并赋予读写权限。
[hadoop@master ~]$ hadoop fs -mkdir -p /user/hive/warehouse
[hadoop@master ~]$ hadoop fs -chmod g w /user/hive/warehouse
[hadoop@master ~]$ mkdir /usr/local/src/hive/tmp
步骤二: 配置hive-env.xml
在此处设置Hive和Hadoop环境变量,这些变量可以使用控制Hive的执行。
[hadoop@master ~]$ cp /usr/local/src/hive/conf/hive-env.sh.template /usr/local/src/hive/conf/hive-env.sh
[hadoop@master ~]$ vi /usr/local/src/hive/conf/hive-env.sh
# Set JAVA
export JAVA_HOME=/usr/local/src/java
# Set HADOOP_HOME to point to a specific hadoop install directory
export HADOOP_HOME=/usr/local/src/hadoop
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/usr/local/src/hive/conf
# Folder containing extra ibraries required for hive compilation/execution can be controlled by:
export HIVE_AUX_JARS_PATH=/usr/local/src/hive/lib
退出保存,数据库的初始化,保证此时MySQL为启动状态执行一下命令。注意的是,需要将Hive连接MySQL的驱动器文件上传至Hive的lib文件夹下。本文选择的驱动器版本为:mysql-connector-java-5.1.26.jar
[hadoop@master ~]$ cp /opt/software/mysql-connector-java-5.1.46.jar /usr/local/src/hive/lib/
[hadoop@master ~]$ schematool -initSchema -dbType mysql
图1-8 Hive驱动器连接MySQL
当显示schemaTool completed时,初始化成功,Hive与MySQL建立连接。启动完毕后查看MySQL下hive_db数据库,发现多出许多个新表(55个)。
图1-9 Hive_db数据库下生成表
步骤三: 启动Hive
启动Hadoop集群,MySQL后,命令框输入hive。
[hadoop@master ~]$ hive
图1-10 Hive shell页面
创建新表并验证MySQL。
hive> show databases;
hive> create database hive_test_db;
hive> use hive_test_db;
hive> create table t_user(id int, name string);
hive> show tables;
图1-11 Hive创建表
打开MySQL数据库,使用实验二配置过的hive_db数据库,此时注意,hive创建的表统一都在hive_db数据库的TBLS表中。当创建表存在,既基于MySQL存储元数据的Hive组件搭建完毕。
mysql> use hive_db;
mysql> select * from TBLS;
图1-12 验证MySQL
实验任务四:beeline CLI远程访问Hive
步骤一: 修改Hadoop的core-site.xml文件
使用beeline CLI访问Hive,需要在Hadoop集群中为Hive赋予代理用户权限。
[hadoop@master ~]$ cd /usr/local/src/hadoop/etc/hadoop
[hadoop@master hadoop]$ vi core-site.xml
[hadoop@slave1 ~]$ vi /usr/local/src/hadoop/etc/hadoop/core-site.xml
[hadoop@slave2 ~]$ vi /usr/local/src/hadoop/etc/hadoop/core-site.xml
#添加如下配置
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
注意:其中hadoop.proxyuser.hadoop.hosts与hadoop.proxyuser.hadoop.groups标注灰色的主机名为访问的hadoop代理用户名。既给与相关权限可以通过hiveserver2服务进行访问操作。“*”为固定写法,前者表示Hadopp集群下所有节点可以使用hadoop代理用户访问Hive,后者表示所有组。
启动hiveserver2服务,等待时间较长,此页面不要关闭。
[hadoop@master hadoop]$ cd
[hadoop@master ~]$ stop-all.sh
[hadoop@master ~]$ start-all.sh
[hadoop@master ~]$ hiveserver2
图1-13 启动hiveserver2服务
步骤二: 添加远程访问节点
假设在slaves1节点进行远程访问,首先需要在slaves1节点上添加Hive组件,从master节点复制即可。
[root@master ~]# scp -r /usr/local/src/hive root@slave1:/usr/local/src/
[root@slave1 ~]# chown -R hadoop:hadoop /usr/local/src/hive
slaves1配置hadoop用户环境变量,可以使用Hive命令。
[root@slave1 ~]# vi /etc/profile
#hive
export HIVE_HOME=/usr/local/src/hive
export HIVE_CONF_DIR=$HIVE_HOME/conf
export PATH=$HIVE_HOME/bin:$PATH
[root@slave1 ~]# su - hadoop
[hadoop@ slave1 ~]$ source /etc/profile
步骤三: 远程访问
通过jdbc 连接到beeline 就可以对 hive 进行操作了。在slaves1节点hadoop用户下执行以下命令。
[hadoop@slave1 ~]$ beeline -u jdbc:hive2://master:10000
图1-14 其他节点远程连接
同时可以在Hive WebUI页面上查看访问的客户端。如下图所示,192.168.90.110(master)节点与192.168.90.181(slave1)节点并发访问Hive。
图1-15 Hive Web页面查看访问节点
实验二 Hive 库操作与表操作
实验内容与目标
完成本实验,您应该能够:
- 掌握Hive数据库操作
- 掌握Hive表操作
相关知识
这里记录了Hive DDL语句,包括:
CREATE DATABASE/SCHEMA, TABLE, VIEW, FUNCTION, INDEX
DROP DATABASE/SCHEMA, TABLE, VIEW, INDEX
TRUNCATE TABLE
ALTER DATABASE/SCHEMA, TABLE, VIEW
MSCK REPAIR TABLE (or ALTER TABLE RECOVER PARTITIONS)
SHOW DATABASES/SCHEMAS, TABLES, TBLPROPERTIES, VIEWS, PARTITIONS, FUNCTIONS, INDEX[ES], COLUMNS, CREATE TABLE
DESCRIBE DATABASE/SCHEMA, table_name, view_name, materialized_view_name
实验环境
服务器集群 | 3个以上节点,节点间网络互通,各节点最低配置:双核CPU、8GB内存、100G硬盘 |
---|---|
运行环境 | CentOS 7.2 |
用户名/密码 | root/password hadoop/password |
服务和组件 | HDFS、Yarn、MapReduce |
实验过程
实验任务一:Hive库操作
步骤一: 创建数据库
Hive中创建学校数据库。
[hadoop@master ~]$ hive
hive > create database school;
图1-16 Hive创建数据库
语法:CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment] //关于数据块的描述
[LOCATION hdfs_path] //指定数据库在HDFS上的存储位置
[WITH DBPROPERTIES (property_name=property_value, ...)];
步骤二: 修改数据库并显示数据库详细信息
hive> alter database school set dbproperties('creater'='H3C');
hive> desc database extended school;
添加自定义属性,创建者为H3C。
图1-17 Hive修改数据库属性
hive> alter database school set owner user root;
hive> desc database extended school;
修改数据库的所有者为root。
图1-18 Hive修改数据库所有者
语法:desc database [extended] database_name;
步骤三: 删除数据库并显示全部数据库
hive> drop database school;
hive> show databases;
语法:show <database_name>
drop database <database_name>
图1-19 Hive删除数据库并显示
其他操作,如切换数据库,语法:use database_name。删除包含表的数据库,语法:drop database if exists database_name cascade。查看正在使用哪个库,语法:select current_database()。其他操作可参考官方说明文档。
实验任务二:Hive表操作
步骤一:创建表
在school数据库中建立teacher表,具有工号、姓名、学科,授课年级四项属性。创建之前需要使用use语言切换操作数据库。
hive> create database school;
hive> use school;
hive> create table teacher(
> num int,
> name string,
> email map<string,int>,
> class array<string>);
图1-20 Hive创建表
语法: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] ---数据存储的文件夹地址信息
Hive默认创建的普通表被称为管理表或内部表。表的数据由Hive进行统一管理,默认存储于数据仓库目录中。可通过Hive的配置文件hive-site.xml对进行修改。可以通过Hadoop web UI进行查看创建结果。
图1-21 HDFS查看创建结果
除了默认的内部表之外,Hive也可以使用关键词“EXTERNAL”创建外部表。外部表的数据可以存储于数据仓库以外的位置,既可以手动修改存储于HDFS上的地址。
分区表:目的是为了避免暴力扫描,一个分区就是HDFS上的一个独立文件夹;Hive的分区就是HDFS的目录分割;注意的是,创建表时指定的表的列中不应该包含分区列,分区列需要使用关键词partitioned by在后面单独指定。
hive> create table teacher(
> num int,
> name string,
> email map<string,int>,
> class array<string>)
> partitioned by (age int)
> row format delimited fields terminated by ",";
分桶表:可以将表或者分区进一步细化成桶,是对数据进行更细粒度的划分,以便获得更高的查询效率。桶在数据存储上与分居不同的是,一个分区会存储于一个目录数据文件存储于该目录中,而一个桶将存储为一个文件,数据内容存储于文件中。注意的是,创建桶表时指定桶列需要提前创建,使用关键词clustered by在后面单独指定,并指定分为多少个桶(buckets)。
hive> create table teacher(
> num int,
> name string,
> email map<string,int>,
> class array<string>)
> clustered by (num) into 4 buckets
> row format delimited fields terminated by ",";
步骤二:查看所有表与详细信息
hive> show tables; hive> desc teacher; hive> desc formatted teacher; 语法:desc <table_name>
图1-22 Hive查看表详情
也可以复制一个已经存在的表。
hive> create table teacher2 like teacher;
语法:create <table_name> like <table_copy_name>;
步骤三:修改表
修改表名。
hive> alter table teacher rename to new_teacher;
语法:alter table <table_name> rename to <new_table_name>
修改表的列名,数据类型,列注释和列所在的位置,FIRST将列放在第一列,AFTER col_name将列放在col_name后面一列。下面的语句将列名num修改为number,数据类型为更改为string并添加注释,最后将这一列放在name后面。
hive> alter table new_teacher change num number string comment 'the num of teacher, change datatype to string ' after name;
语法:alter table <table_name> change [cloumn] <col_old_name> <col_new_name> column_type [conmment col_conmment] [first|after column_name];
增加/更新列,add columns允许用户在当前列的末尾,分区列之前添加新的列,replace columns允许用户更新列,更新的过程是先删除当前的列,然后在加入新的列。
hive> alter table new_teacher add columns(age int);
语法:alter table <table_name> add|replace columns (<col_name> data_type [conmment col_comment], ...);
图1-23 alter操作
步骤四:删除表退出
删除表。 hive> drop table teacher2; 语法:drop table <table_name> 清空表。 hive> truncate table new_teacher; 语法:truncate table <table_name> hive> exit;
图1-24 清空数据并删除表
实验三 Hive查询
实验内容与目标
完成本实验,您应该能够:
- 学习Hive Shell基本操作。
- 学习多表查询
实验视图
图1-25 select简单操作
实验环境
服务器集群 | 3个以上节点,节点间网络互通,各节点最低配置:双核CPU、8GB内存、100G硬盘 |
---|---|
运行环境 | CentOS 7.2 |
用户名/密码 | root/password hadoop/password |
服务和组件 | HDFS、Yarn、MapReduce |
实验过程
实验任务一:数据导入
步骤一:插入单条数据并查询
新建学生表,具有学号,姓名,班级,身高体重信息,成绩,插入单条数据进行测试。插入复杂类型需要使用select命令转储。查询语句则跟MySQL语语句一致。
语法:insert into <table_name> select <data,map(), array()>
语法:select * from <table_name>;
hive> create table student(
> num int,
> name string,
> class string,
> body map<string,int>,
> exam array<string>)
> row format delimited
> fields terminated by '|'
> collection items terminated by ','
> map keys terminated by ':'
> lines terminated by 'n';
hive> create table lib(
> num int,
> book string)
> row format delimited
> fields terminated by '|'
> collection items terminated by ','
> map keys terminated by ':'
> lines terminated by 'n';
hive> create table price(
> book string,
> price int)
> row format delimited
> fields terminated by '|'
> collection items terminated by ','
> map keys terminated by ':'
> lines terminated by 'n';
hive> insert into student (num,name,class,body,exam) select 20200101,'Wlen','grade 2',map('height',175,'weight',60),array('80','70');
图1-26 插入单条信息
步骤二:批量导入
在插入数据过程中调用MR操作,效率低下,既Hive的数据通常为Load批量导入。准备数据,数据可以为本地存储,也可以是HDFS上。
数据存储在txt文本中,属性之间以” |”隔开,需要注意的是在创建表时,应设置fields terminated by '|',否则,默认为“,”。由于表中含有复杂数据格式,简单的分隔符通常失去效果。数据如下:
图1-27 导入信息详情
使用Load函数批量导入数据。
hive> load data local inpath '/opt/software/student.txt' into table student;
hive> load data local inpath '/opt/software/lib.txt' into table lib;
hive> load data local inpath '/opt/software/price.txt' into table price;
语法:load data local inpath <address> [overwrite] into table < table_name>;
当数据存储地址为HDFS时,相当于对数据在HDFS上进行迁移。
语法:load data inpath <address> [overwrite] into table <table_name>;
图1-28 数据导入
实验任务二:select查询
步骤一:简单查询
Hive中的SELECT基础语法和标准SQL语法基本一致,支持WHERE、DISTINCT、GROUP BY、ORDER BY、HAVING、LIMIT、子查询等;在所有的数据库系统中,SELECT语句是使用最多,也最复杂的一块。
语法:SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition] [GROUP BY col_list] [CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list] ] [LIMIT number]
普通查询跟MySQL查询的一模一样。
hive> select * from student;
图1-29 select查询
步骤二:条件查询
1.where语句
Where语句是属于布尔表达式,其后可以与“且”,“或”进行联动进行复杂查询。注意特殊字段的查找方式。
hive> select * from student where class = 'grade 4';
hive> select * from student where exam[0] = 96 or exam[1]=77;
hive> select * from student where body['height'] = 170;
图1-30 条件查询
2. distinct和 all语句
distinct用途为去除重复的项,不加参数则默认为all。distinct参数执行时调用MR进行排序,对大规模数据效率较高。
hive> select class from student;
hive> select distinct class from student;
图1-31 去除重复项
3. group by与having语句
group by是对列进行分组查询,having可以对group by结果进行进一步的过滤。Having与where的区别是,where后面不能写分组函数,而having后面可以使用分组函数。
以下语句首先筛选统计年级总数,然后过滤出2年级以上的同学有多少个。
hive> select class ,count(*) from student group by class;
hive> select class ,count(*) num from student group by class having num >=2;
其中num为存储count(*)的结果。
图1-32 分组查询
步骤三:limit限制语句与union联合
语法: Select * from <table_name> limit <up,down> select UNION [ALL | DISTINCT] select UNION [ALL | DISTINCT] select …
Limit限制查询的说明范围,当大数据查询时,行出过多需要限制查询。union把多个select的结果并集展示出来,可以多表联动。
hive> select * from student limit 2,4; hive> select class from student union select num from student;
图1-33 限制查询
步骤四:order by排序与sort by排序
order by为全局排序,后面可以有多列进行排序,默认按字典排序。对于大规模的数据集order by的效率非常低。在很多情况下,并不需要全局排序,此时可以使用sort by。以下对成绩进行排序,结果虽然一样。当遇到大规模数据时,sort by可以通过修改reducer个数,为每个reducer产生一个排序文件。每个Reducer内部进行排序,对全局结果集来说不是排序。而order by只调用一个Reducer进行计算。
hive> set mapreduce.job.reduces=3; hive> select * from student sort by exam[0]; hive> select * from student order by exam[0];
图1-34 排序
步骤五:JOIN多表查询
语法:select <clo> from <table_name> join <table_name> on <table.clo>=< table.clo > join <table_name> on <table.clo>=< table.clo >…
join可以连接多表联合查询,要求查询的条件在连个表中,而且连接 n个表,至少需要n-1个连接条件。例如:连接三个表,至少需要两个连接条件。本例有两个表,以为学生表具有学号num,一个图书馆表,具有学号以及借书名称。
hive> select * from student join lib on student.num =lib.num;
查询每个人的借书的名称。
图1-35 两表查询
hive> select * from student left outer join lib on student.num =lib.num;
左连接,查询每个人的借书的名称。区别是左表的信息都显示,例如:下图中学号20200103与20200106没有借书记录,显示为NULL。
图1-36 左连接查询
hive> select * from student right outer join lib on student.num =lib.num;
与左连接对应的是右连接,右表全部显示。
图1-37 右连接查询
hive> select * from student full outer join lib on student.num =lib.num; 全连接是左右连接的综合使用,显示两张表的所有信息。若没有关联项目则放到最后显示为NULL。
图1-38 全连接查询
hive> select * from student left semi join lib on student.num =lib.num;
半连接只显示左表内容,即显示跟连接的右表有关系的左表内容。
图1-39 半连接查询
hive> select * from student join lib on student.num =lib.num join price on lib.book=price.book;
多表(两个以上)查询,例如:查询学生租借的书以及书的价格。大多数情况下,Hive会对每对jion连接对象启动一个MapReduce任务。
图1-40 多表查询