目录
(6)设置 hadoop 的代理用户,以便 root 用户能够远程登录访问Hive
素材
http://链接: https://pan.baidu.com/s/1Aj2hGtXsvqYFySnObpGIvQ?pwd=n64i 提取码: n64i
一、数据仓库简介
1、数据仓库的认识
数据仓库是一个面向主题的、集成的、随时间变化的,但信息本身相对稳定的数据集合,它用于支持企业或组织的决策分析处理。
(1)数据仓库是面向主题的。
操作型数据库的数据组织是面向事务处理任务,而数据仓库中的数据是按照一定的主域进行组织,这里说的“主题”是一个抽象的概念,它指的是用户使用数据仓库进行决策时心的重点方面,一个主题通常与多个操作型信息系统相关。例如,商品的推荐系统就是基于数据仓库设计的,商品的信息就是数据仓库所面向的主题。
(2)数据仓库是随时间变化的。
数据仓库是不同时间的数据集合,它所拥有的信息并不只是反映企业当前的运营状态而是记录了从过去某一时间点到当前各个阶段的信息。可以这么说,数据仓库中的数据保存时限要能满足进行决策分析的需要(如过去的 5~10年),而且数据仓库中的数据都要标明该数据的历史时期。
(3)数据仓库相对稳定
数据仓库是不可更新,因为数据仓库主要目的是为决策分析提供数据,所涉及的操作主要是数据的查询,,一旦某个数据的存入数据仓库以后,一般情况下将被长期保留,也就是数据仓库中一般有大量的查询操作,修改和删除操作很少,通常只需要定期的加载、刷新来更新数据。
(4)OLTP和OLAP
数据处理大致可以分为两类,分别是联机事务处理(OLTP)和联机分析处理(OLAP)。
a、OLTP 是传统关系数据库的主要应用,主要针对的是基本的日常事物处理,例如,银行转账。
b、OLAP 是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果,例如,商品的推荐系统。
对比项目 | OLTP | OLAP |
用户 | 操作人员、底层管理人员 | 决策人员、高级管理人员 |
功能 | 日常操作处理 | 分析决策 |
DB设计 | 基于ER模型,面向应用 | 星型/雪花型模型,面向主题 |
DB规模 | GB至TB | >= TB |
数据 | 最新的、细节的、二维的、分立的 | 历史的、聚集的、多维的、集成的 |
存储规模 | 读/写数条(甚至几百条)记录 | 读上百万条(甚至上亿条)记录 |
操作频度 | 非常频繁(以秒计) | 比较稀松(以小时甚至周计) |
工作单元 | 严格的事务 | 复杂的查询 |
用户数 | 数百个至数千万个 | 数个至数百个 |
度量 | 事务吞吐量 | 查询吞吐量,响应时间 |
2、数据仓库的结构
数据仓库的结构包含了四部分,分别是数据源、数据存储及管理、OLAP服务器、前端工具。
(1)数据源
数据源是数据仓库的基础,即系统的数据来源,通常包含企业的各种内部信息和外部信息。内部信息,例如存在操作数据库中的各种业务数据和自动化系统中包含的各类文档数据;外部信息,例如各类法律法规,市场信息、竞争对手的信息以及外部统计数据和其他相关文档等。
(2)数据存储及管理
数据存储及管理是整个数据仓库的核心。数据仓库的组织管理方式决定了它有别于传数据库同时也决定了对外部数据的表现形式。针对系统现有的数据,进行抽取、清理并有效集成,按照主题进行组织。数据仓库按照数据的覆盖范围可以划分为企业级数据仓库加部门级数据仓库,也就是所谓的数据集市。数据集市可以理解为是一个小型的部门或者工作组级别的数据仓库。
(3)OLAP 服务器
OLAP服务器对需要分析的数据按照多维数据模型进行重组,以支持用户随时进行多角度、多层次的分析,并发现数据规律和趋势。
(4)前端工具
前端工具主要包含各种数据分析工具、报表工具、查询工具、数据挖掘工具以及各种基于数据仓库或数据集市开发的应用。
3、数据仓库的数据模型
(1)星状模型
星状模型是维度建模中的一种选择方式。星状模型是由一个事实表和一组维度表组合而成,并且以事实表为中心,所有的维度表直接与事实表相连,维度表的主键放置在事实表中,作为事实表与维度表连接的外键,因此,维度表和事实表是有关联的,然而,维度表与维度表并没有直接相连,因此,维度表之间是并没有关联的。
(2)雪花模型
雪花模型也是维度建模中的另一种选择,它是对星状模型的扩展,其中雪花模型的维度表可以拥有其他的维度表,并且维度表与维度表之间是相互关联的。因此,雪花模型比星状模型更规范一些,但是,由于雪花模型需要关联多层的维度表,因此,性能也比星状模型要低,所以一般不是很常用。
(3)事物表和维度表的认识
a、事实表
每个数据仓库都包含一个或者多个事实数据表,事实表是对分析主题的度量,它包含了与各维度表相关联的外键,并通过连接(Join)方式与维度表关联。事实表的度量通常是数值类型,且记录数会不断增加,表规模迅速增长。例如,现存在一张订单事实表,其字段 Prod_id(商品id)可以关联商品维度表、TimeKey(订单时间)可以关联时间维度表等。
b、维度表
维度表可以看作用户分析数据的窗口,维度表中包含事实数据表中事实记录的特性,有些特性提供描述性信息,有些特性指定如何汇总事实数据表数据,以便为分析者提供有用的信息。维度表包含帮助汇总数据的特性的层次结构,维度是对数据进行分析时特有的一个角度,站在不同角度看待问题,会有不同的结果。例如,当分析产品销售情况时,可以选择按照商品类别、商品区域进行分析,此时就构成一个类别、区域的维度。维度表信息较为固定,且数据量小,维度表中的列字段可以将信息分为不同层次的结构级。
二、Hive的简介
1、Hive的认识
Hive是建立在 Hadoop 文件系统上的数据仓库,它提供了一系列工具,能够对存储在 HDFS 中的数据进行数据提取、转换和加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的工具。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它可以将结构化的数据文件映射为一张数据表,允许熟悉 SQL的用户查询数据,也允许熟悉 MapReduce 的开发者开发自定义的 mapper 和 reducer 来处理复杂的分析工作,相对于Java 代码编写的 MapReduce 来说, Hive的优势更加明显。由于 Hive 采用了 SQL 的查询语言 HQL,因此很容易将 Hive 理解为数据库。其实从结构上来看:Hive 和数据库除了拥有类似的查询语言,再无类似之处。
对比项 | Hive | MySQL |
---|---|---|
查询语言 | Hive OL | SQL |
数据存储位置 | HDFS | 块设备、本地文件系统 |
数据格式 | 用户定义 | 系统决定 |
数据更新 | 不支持 | 支持 |
事物 | 不支持 | 支持 |
执行延迟 | 高 | 低 |
可扩展性 | 高 | 低 |
数据规模 | 大 | 小 |
多表插入 | 支持 | 不支持 |
2、Hive系统架构
Hive 是底层封装了 Hadoop 的数据仓库处理工具,它运行在 Hadoop 基础上,其系统架的组成主要包含4个部分,分别是用户接口、跨语言服务、底层的驱动引擎以及元数据存储系统 。
(1)用户接口
主要分为3个,分别是 CLI、JDBCI/ODBC 和 WebUI。其中,CLI 即 Shell 终端命令行,它是最常用的方式。JDBCI/ODBC是Java实现,与使用传统数据库JDBC的方式类似,WebUI指的是通过浏览器访问 Hive。
(2)跨语言服务(Thrift Server)
Thrilt 是 Facebook 开发的一个软件框架,可以用来进行可扩展且跨语言的服务。Hive 集成了该服务,能让不同的编程语言调用 Hive 的接口。
(3)底层的驱动引擎
主要包含编译器(Compiler),优化器(Optimizer)和执行器(Executor),它们用于完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成,生成的查询计划存储在 HDFS 中,并在随后由 MapReduce 调用执行。
(4)元数据存储系统(Metastore)
Hive中的元数据通常包含表名、列、分区及其相关属性,表数据所在目录的位置信息,Metastore 默认存在自带的 Derby 数据库中。由于Derby数据库不适合多用户操作,并且数据存储目录不固定,不方便管理,因此,通常都将元数据存储在 MySQL 数据库。
3、Hive工作原理
Hive是建立在Hadoop上的,它们之间的工作过程大致如下。
(1)UI将执行的查询操作发送给 Driver 执行。
(2)Driver借助查询编译器解析查询,检查语法和查询计划或查询需求。
(3)编译器将元数据请求发送到 Metastore。
(4)编译器将元数据作为对编译器的响应发送出去。
(5)编译器检查需求并将计划重新发送给 Driver。至此,查询的解析和编译已经完成。
(6)Driver 将执行计划发送给执行引擎执行 Job 任务。
(7)执行引擎从DataNode上获取结果集,并将结果发送给UI和Driver。
4、Hive数据模型
Hive中所有的数据都存储在 HDFS中,它包含数据库(Database)、表(Table)、分区起(Partition)和桶表(Bucket)4种数据类型 。
(1)数据库
相当于关系数据库中的命名空间(namespace),它的作用是将用户和数据库的应用,隔离到不同的数据库或者模式中。
(2)表
Hive的表在逻辑上由存储的数据和描述表格数据形式的相关元数据组成。表储的数据存放在分布式文件系统里,如HDFS。Hive 中的表分为两种类型,一种叫作内部表,这种表的数据存储在Hive数据仓库中;一种叫作外部表,这种表的数据可以存放在 Hive数据仓库外的分布式文件系统中,也可以存储在 Hive 数据仓库中。值得一提的是 Hive数据仓库也就是HDFS中的一个目录,这个目录是 Hive 数据存储的默认路径,它可以在Hive的配置文件中配置,最终也会存放到元数据库中。
(3)分区
分区的概念是根据“分区列”的值对表的数据进行粗略划分的机制,在Hive存储上的体现就是在表的主目录(Hive的表实际显示就是一个文件夹)下的一个子目录,这个子目录的名字就是定义的分区列的名字。分区是为了加快数据查询速度设计的,例如,现在有个日志文件,文件中的每条记录都带有时间戳。如果根据时间来分区,那么同一天的数据将会被分到同一个分区中。这样的,如果查询每一天或某几天的数据就会变得很高效,因为只需要扫描对应分区中的文件即可。
注意:分区列不是表里的某个字段,而是独立的列,根据这个列查询存储表中的数据文件。
(4)桶表
简单来说,桶表就是把“大表”分成了“小表”。把表或者分区组织成桶表的目的主要是为了获得更高的查询效率,尤其是抽样查询更加便捷。桶表是 Hive数据模型的最小单元,数据加载到桶表时,会对字段的值进行哈希取值,然后除以桶个数得到余数进行分桶,保证每个桶中都有数据,在物理上,每个桶表就是表或分区的一个文件。
三、Hive的安装
1、Hive安装模式的认识
Hive安装模式分为3种,分别是嵌人模式、本地模式和远程模式。
(1)嵌人模式
使用内嵌的Derby数据库存储元数据,这种方式是 Hive 的默认安装方.配置简单,但是一次只能连接一个客户端,适合用来测试,不适合生产环境。
(2)本地模式
采用外部数据库存储元数据,该模式不需要单独开启 Metastore 服务,因为本地模式使用的是和 Hive 在同一个进程中的 Metastore 服务。
(3)远程模式
与本地模式一样,远程模式也是采用外部数据库存储元数据。不同的是,远程模式需要单独开启 Metastore服务,然后每个客户端都在配置文件中配置连接该 Metastore 服务。远程模式中,Metastore服务和 Hive 运行在不同的进程中。
本地模式和远程模式安装配置方式大致相同,本质上是将 Hive 默认的元数据存储介由自带的Derby数据库替换为 MySQL数据库,这样无论在任何目录下以任何方式启动 Hive,只要连接的是同一台 Hive 服务,那么所有节点访问的元数据信息是一致的,从而实现元数据的共享。
2、下载安装Hive
(1)下载
将 apache-hive-1.2.2-bin.tar.gz 下载到/export/software/目录下。
Hive所有版本下载地址。目前最高版本3.1.3http://archive.apache.org/dist/hive/
apache-hive-1.2.2 下载地址http://archive.apache.org/dist/hive/hive-1.2.2/
(2)解压
进入目录/export/software/,将hive-1.2.2解压到 /export/servers/ 下。
tar -xzvf apache-hive-1.2.2-bin.tar.gz -C /export/servers/
(3)重命名
将安装目录 apache-hive-1.2.2-bin 重命名为 hive 进入目录/export/servers/,执行命令
cd /export/servers/
mv apache-hive-1.2.2-bin hive
(4)下载mysql驱动包
下载文件 mysql-connector-java-8.0.20.jar 到 hive/lib 下。
3、安装MySql
(1)安装
安装Mysql有很多种方式,这里我们通过本地命令来安装Mysql,执行以下命令。这里需要说明以下MariaDB 是替换相同 MySQL 版本的二进制代码,是 MySQL 中的增强型替代品。
下载MySQL
yum install mariadb-server
yum install mariadb-devel
yum install mariadb -y
查看安装
rpm -qa | grep mariadb
确保出现以下这四个
mariadb-5.5.68-1.el7.x86_64
mariadb-server-5.5.68-1.el7.x86_64
mariadb-libs-5.5.68-1.el7.x86_64
mariadb-devel-5.5.68-1.el7.x86_64
(2)配置
设置开机自启
systemctl enable mariadb
启动数据库服务
systemctl start mariadb
进入数据库后执行以下代码
mysql>use mysql;
mysql>update user set Password=PASSWORD('123456') where user='root';
mysql>grant all PRIVILEGES on *.* to 'root'@'% ' identified by '123456' with grant option;
mysql>FLUSH PRIVILEGES;
mysql>quit
再次登录执行以下指令
mysql -uroot -p123456
4、配置Hive
(1)修改hive-env.sh文件
d /export/servers/hive/conf
复制文件
cp hive-env.sh.template hive-env.sh
修改hive-env.sh配置文件,添加Hadoop环境变量,具体内容如下:
export JAVA_HOME=/export/servers/jdk
export HADOOP_HOME=/export/servers/hadoop-2.10.1
#由于部署 Hadoop 时已经配置了全局 Hadoop 环境变量,因此可以不设置上面2行参数。
export HIVE_HOME=/export/servers/hive
export HIVE_CONF_DIR=/export/servers/hive/conf
export HIVE_AUX_JARS_PATH=/export/servers/hive/lib
(2)修改hive-site.xml文件
创建相关文件
vi hive-site.xml
添加以下配置
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop01.bgd01:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>Username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
<description>password to use against metastore database</description>
</property>
<property>
<name>hive.execution.engine</name>
<value>mr</value>
<description>
Expects one of [mr, tez, spark].
Chooses execution engine. Options are: mr (Map reduce, default), tez, spark. While MR
remains the default engine for historical reasons, it is itself a historical engine
and is deprecated in Hive 2 line. It may be removed without further warning.
</description>
</property>
</configuration>
(3)配置环境变量
vi /etc/profile
添加如下2行:
export HIVE_HOME=/export/servers/hive
export PATH=$PATH:$HIVE_HOME/bin
(4)初始化数据仓库hive
bin/schematool -dbType mysql -initSchema
初始化成功
(5)同步文件到集群其它节点
将 hadoop01 上安装的 Hive 程序分别复制到hadoop02、hadoop03服务器上
scp -r /export/servers/hive/ hadoop02.bgd01:/export/servers/
scp -r /export/servers/hive/ hadoop03.bgd01:/export/servers/
同步全局环境配置文件
scp /etc/profile hadoop02.bgd01:/etc/
scp /etc/profile hadoop03.bgd01:/etc/
(6)设置 hadoop 的代理用户,以便 root 用户能够远程登录访问Hive
修改Hadoop配置文件 core-site.xml
vi /export/servers/hadoop-2.10.1/etc/hadoop/core-site.xml
添加以下配置
<!-- 设置 hadoop 的代理用户-->
<property>
<!--表示代理用户的组所属-->
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
<property>
<!--表示任意节点使用 hadoop 集群的代理用户 hadoop 都能访问 hdfs 集群-->
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
四、启动Hive
1、本地CLI方式
启动Hive
执行如下命令:
hive
显示如下:
hive>
查看数据仓库中的数据库
hive>show databases;
查看数据仓库中的表
hive>show tables;
查看数据仓库中的内置函数
hive>show functions;
清屏
hive>!clear
退出
hive>exit;
hive>quit;
2、远程服务模式
在hadoop01上启动 Hiveserver2服务
hiveserver2
注意, 执行上述命令后, 没有任何显示. 但是,重新打开一个终端,用jps查询,会多出一个RunJar进程.
在hadoop02服务器的Hive安装包下, 执行远程连接命令连接到 Hive数据仓库服务器
(如果只有一台服务器,可以在本地打开另外一个终端进行操作演示)
//输入远程连接命令
bin/beeline
//出现如下显示信息
Beeline version 2.3.9 by Apache Hive
beeline>
//如下输入连接协议
beeline> !connect jdbc:hive2://hadoop01.bgd01:10000
//显示正在连接信息
Connecting to jdbc:hive2://hadoop01.bgd01:10000
//根据提示输入 Hive服务器 hadoop01 的用户名和密码
Enter username for jdbc:hive2://hadoop01.bgd01:10000: root
Enter password for jdbc:hive2://hadoop01.bgd01:10000: ********
//显示已经连接到Hive服务器
Connected to: Apache Hive (version 2.3.9)
Driver: Hive JDBC (version 2.3.9)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://hadoop01.bgd01:10000>
操作数据仓库
现在可以像 CLI方式一样操作数据仓库命令
查看数据仓库中的数据库
0: jdbc:hive2://hadoop01.bgd01:10000> show databases;
查看数据仓库中的表
0: jdbc:hive2://hadoop01.bgd01:10000> show tables;
查看数据仓库中的内置函数
hive>show functions;
退出
0: jdbc:hive2://hadoop01.bgd01:10000>!exit
或
0: jdbc:hive2://hadoop01.bgd01:10000>!quit
五、Hive内置数据类型
1、Hive基本数据类型
数据类型 | 描述 |
---|---|
TINYINT | 1字节有符号整数,-128~127 |
SMALLIAT | 2字节有符号整数,-32768~32767 |
INT | 4字节有符号整数,-2的31次方~2的31次发-1 |
BIGINT | 8字节有符号整数,-2的64次方~2的63次方-1 |
FLOAT | 4字节单精度浮点数 |
DOUBLE | 8字节双精度浮点数 |
DOUBLE PRECISION | Double 的别名, 从 Hive 2.0 开始提供 |
DECIMAL | 任意精度的带符号小数 |
NUMERIC | 同样是 DECIMAL,从 Hive 3.0 开始 |
TIMESTAMP | 精确到纳秒的时间戳 |
DATE | 以年/月/日描述的日期 |
INTERVAL | 表示时间间隔 |
STRING | 字符串 |
VARCHAR | 同 STRING,字符串长度不固定 |
CHAR | 固定长度的字符串 |
BOOLEAN | 用于存储真值(TRUE)和假值(FALSE) |
BINARY | 字节数组 |
2、Hive的复杂数据类型
数据类型 | 描述 |
---|---|
ARRAY | 一组有序字段,字段类型必须相同 |
MAP | 一组无序键值对。键的类型必须是原子类型,值可以是任意类型,同一个映射的键类型必须相同,值的类型也必须相同 |
STRUCT | 一组命名的字段,字段的类型可以不同 |
六、Hive数据模型操作
创建目录 /export/data/hivedata 存放本地数据文件
1、数据库操作
创建数据库 itcast
hive>create database if not exists itcast;
查看数据库信息
hive> describe database itcast;
显示如下信息:
OK
+----------+----------+-------------------------------------------+-------------+-------------+-------------+--+
| db_name | comment | location | owner_name | owner_type | parameters |
+----------+----------+-------------------------------------------+-------------+-------------+-------------+--+
| itcast | | hdfs://ns1/user/hive/warehouse/itcast.db | root | USER | |
+----------+----------+-------------------------------------------+-------------+-------------+-------------+--+
其中,hdfs://ns1/user/hive/warehouse/itcast.db 表示数据库 itcast 所在的hdfs文件系统上的路径。
切换数据库
hive>use itcast;
2、创建内部表
(1) 针对基本数据类型建表
hive>create table t_user(id int, name string, age int)
row format delimited fields terminated by ',';
上传结构化数据文件 user.txt
hadoop fs -put user.txt /user/hive/warehouse/itcast.db/t_user
查询表记录
hive>select * from t_user;
(2) 针对复杂数据类型建表
hive>create table t_student(id int, name string, hobby map<string, string>)
row format delimited fields terminated by ','
collection items terminated by '-'
map keys terminated by ':';
上传结构化数据文件 student_map.txt
hadoop fs -put student_map.txt /user/hive/warehouse/itcast.db/t_student
查询表记录
hive>select * from t_student;
(3) 查看表结构信息
hive>describe t_student;
显示如下信息:
OK
id int
name string
hobby map<string,string>
3、创建外部表
在hdfs上创建目录 /stu
hadoop fs -mkdir /stu
上传本地文件 student.txt 至 hdfs 中的 /stu 目录下
hadoop fs -put student.txt /stu
创建外部表 student_ext
hive>create external table student_ext(Sno int, Sname string, Sex string, Sage int, Sdept string)
row format delimited fields terminated by ',' location '/stu';
查询表 student_ext 中记录
hive>select * from student_ext;
4、Hive分区表操作
(1)Hive普通分区
创建分区表
hive>create table t_user_p(id int, name string)
partitioned by (country string)
row format delimited fields terminated by ',';
从本地加载数据
hive>load data local inpath '/export/data/hivedata/user_p.txt' into table t_user_p
partition(country='USA');
查询表中记录
hive>select * from t_user_p;
hive>select * from t_user_p where country=‘USA';
新增分区
hive>alter table t_user_p ADD PARTITION (country='China') location '/user/hive/warehouse/itcast.db/t_user_p/country=China';
查询表中记录
hive>select * from t_user_p where country='China';
修改分区
hive>alter table t_user_p PARTITION (country='China') RENAME TO PARTITION (country='Japan');
删除分区
hive>alter table t_user_p drop IF EXISTS PARTITION (country='Japan') ;
(2)Hive动态分区
开启动态分区功能
hive>set hive.exec.dynamic.partition=true;
hive>set hive.exec.dynamic.partition.mode=nonstrict;
hive>set mapreduce.framework.name=local; #2.x 版本需要设置
创建原始表
hive>create table dynamic_partition_table(day string, ip string)
row format delimited fields terminated by ',';
加载数据文件至原始表
hive>load data local inpath '/export/data/hivedata/dynamic_partition_table.txt'
into table dynamic_partition_table;
创建目标表
hive>create table d_p_t(ip string) partitioned by (month string, day string);
动态插入
hive>insert overwrite table d_p_t partition (month, day)
select ip, substr(day,1,7) as month, day
from dynamic_partition_table;
查看目标表中的分区数据
hive>show partitions d_p_t;
5、Hive桶表操作
开启桶表功能
hive>set hive.enforce.bucketing=true;
hive>set mapreduce.job.reduces=4;
创建桶表
hive>create table stu_buck(Sno int, Sname string,
Sex string, Sage int, Sdept string)
clustered by(Sno) into 4 buckets
row format delimited fields terminated by ',';
创建stu_buck表的临时表student_tmp
hive>create table student_tmp(Sno int, Sname string,
Sex string, Sage int, Sdept string)
row format delimited fields terminated by ',';
加载数据至临时表
hive>load data local inpath '/export/data/hivedata/student.txt'
into table student_tmp;
将数据导入桶表
hive>insert overwrite table stu_buck
select * from student_tmp cluster by(Sno) ;
如果不再需要的话,可以删除临时表 student_tmp 以释放存储空间
hive>drop table if exists student_tmp ;
查看桶文件内容
在linux系统提示符下执行如下命令:
hadoop fs -cat /user/hive/warehouse/itcast.db/stu_buck/000000_0
显示如下内容:
95004,张立,男,19,IS
95008,李娜,女,18,CS
95012,孙花,女,20,CS
95016,钱国,男,21,MA
95020,赵钱,男,21,IS
将 000000_0 依次改为 000001_0、000002_0、000003_0 进行显示,并与 student.txt 文件中的内容进行比较。
七、Hive数据操作
1、创建表
(1)创建emp表
hive>create table emp(empno int, ename string, job string, mgr int,
hiredate string, sal double, comm double, deptno int)
row format delimited fields terminated by '\t';
(2)创建dept表
hive>create table dept(deptno int, dname string, loc int)
row format delimited fields terminated by '\t';
(3)加载数据
hive>load data local inpath '/export/data/hivedata/emp.txt'
into table emp;
hive>load data local inpath '/export/data/hivedata/dept.txt'
into table dept;
2、数据查询
例1 基本查询
(1) 全表查询
hive>select * from emp;
(2) 选择特点字段查询
hive>select deptno, dname from dept;
(3) 查询员工表总人数
hive>select count(*) cnt from emp;
(4) 查询员工表总工资额
hive>select sum(sal) sum_sal from emp;
(5) 查询5条员工表的信息
hive>select * from emp limit 5;
例2 Where条件查询
(1) 查询工资等于 5000 的所有员工
hive>select * from emp where sal = 5000;
(2) 查询工资在 500 到 1000 的员工信息
hive>select * from emp where sal between 500 and 1000;
(3) 查询 comm 为空的所有员工信息
hive>select * from emp where comm is null;
(4) 查询工资是 1500 和 5000 的员工信息
hive>select * from emp where sal in (1500, 5000);
例3 Like 和 Rlike
(1) 查询工资以 2 开头的员工信息
hive>select * from emp where sal like '2%';
(2) 查询工资的第二个数值为 2 的员工信息
hive>select * from emp where sal like '_2%';
(3) 查询工资中含有 2 的员工信息
hive>select * from emp where sal rlike '[2]';
#本句执行在 2.x 版本出现语法错误:Argument type mismatch 'sal': regexp only takes STRING_GROUP types as 1st argument, got DOUBLE
例4 Group by 语句
(1) 计算 emp 表每个部门的平均工资
hive>select t.deptno, avg(t.sal) avg_sal from emp t group by t.deptno;
(2) 计算 emp 表每个部门中每个岗位的最高工资
hive>select t.deptno, t.job, max(t.sal) max_sal from emp t group by t.deptno, t.job;
例5 Having 语句
Having 只用于 Group by 分组统计语句
(1) 求每个部门的平均工资
hive>select deptno, avg(sal) from emp group by deptno;
(2) 求每个部门的平均工资大于 2000 的部门
hive>select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;
例6 Order by 语句
(1) 查询员工信息,按工资降序排序
hive>select * from emp order by sal desc;
(2) 按部门编号和工资升序排序
hive>select * from emp order by deptno,sal;
例7 Sort by 语句
(1) 设置 reduce 个数
hive>set mapreduce.job.reduces=3;
(2) 查看设置 reduce 个数
hive>set mapreduce.job.reduces;
(3) 根据部门编号降序查看员工信息
hive>select * from emp sort by deptno desc;
(4) 将查询结果导入到文件中(按部门编号降序排列)
hive>insert overwrite local directory '/root/sortby-result'
select * from emp sort by deptno desc;
例8 Distribute by 语句
(1) 设置 reduce 个数
hive>set mapreduce.job.reduces=3;
(2) 先按部门编号分区,再按员工编号降序排序
hive>insert overwrite local directory '/root/distribute-result'
select * from emp distribute by deptno sort by empno desc;
例9 Cluster by 语句
以下两种排序等价
hive>select * from emp cluster by deptno;
hive>select * from emp distribute by deptno sort by deptno;
例10 Join 操作
(1) 根据员工表和部门表中的部门编号相等,查询员工编号、员工姓名、部门编号、部门名称
hive>select e.empno, e.ename, d.deptno, d.dname
from emp e join dept d on e.deptno = d.deptno;
(2) 左外连接:Join操作符左边表中符合条件的所有记录会被返回
hive>select e.empno, e.ename, d.deptno, d.dname
from emp e left join dept d on e.deptno = d.deptno;
(3) 右外连接:Join操作符右边表中符合条件的所有记录会被返回
hive>select e.empno, e.ename, d.deptno, d.dname
from emp e right join dept d on e.deptno = d.deptno;
(4) 满外连接:返回所有表中符合条件的所有记录,如果任一表的指定字段没有符合条件的值的话,使用 NULL 值代替。
hive>select e.empno, e.ename, d.deptno, d.dname
from emp e full join dept d on e.deptno = d.deptno;
(5) 使用 Join 操作符,返回部门编号为20的记录。
hive>select e.empno, e.ename, d.deptno, d.dname
from emp e full join dept d on e.deptno = d.deptno where d.deptno=20;
1、打印列名:
set hive.cli.print.header=true;
2、每行显示一个key、value,即\G类似的方式
set hive.cli.print.header=true;
set hive.cli.print.row.to.vertical=true;
set hive.cli.print.row.to.vertical.num=1;
参考书籍
《Hadoop大数据技术原理与应用》