分布式-一文搞定hive

本文全面介绍了Hive,包括其基本思想、使用场景、特点、基本架构、安装过程、使用方式、建库建表与数据导入、查询语法、函数使用等。通过实例展示了Hive如何处理数据,如数据导入导出、分区表创建、数据类型、查询语句和内置函数的使用。此外,还介绍了自定义函数的开发和综合查询案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1 什么是hive

1.1 hive基本思想

1.2 为什么要使用Hive

1.3 Hive得特点

2 hive的基本架构

3 Hive安装

3.2.    标准安装:将mysql作为元数据库

3.2.1.    mysql安装

3.2.2 hive的元数据库配置

4 hive使用方式

4.1 最基本使用方式

4.2 启动hive服务使用

4.3 脚本化运行

5.    hive建库建表与数据导入

5.1.    建库

5.2.    建表

5.2.1.    基本建表语句

5.2.2.    删除表

5.2.3.    内部表与外部表

5.2.4.    分区表

5.3.    数据导入导出

5.3.1.    将数据文件导入hive的表

5.3.2.    将hive表中的数据导出到指定路径的文件

5.3.3.    hive文件格式

5.4.    数据类型

5.4.1.    数字类型

5.4.2.    日期时间类型

5.4.3.    字符串类型

5.4.4.    混杂类型

5.4.5.    复合类型

5.5.    修改表定义

6.    hive查询语法

6.1.    基本查询示例

6.4.    left semi join

6.5.    group by分组聚合

6.6.    子查询

7.    hive函数使用

7.1.    常用内置函数

7.1.1.    类型转换函数

7.1.3.    字符串函数

7.1.4.    时间函数

7.1.5.    表生成函数

7.1.6.    集合函数

7.1.7.    条件控制函数

7.1.9.    分析函数:row_number() over()——分组TOPN

7.2.    自定义函数

7.2.1.    需求:

7.2.2.    实现步骤:

8.     综合查询案例

8.1.    用hql来做wordcount


 

1 什么是hive

 

1.1 hive基本思想

Hive是基于Hadoop的一个数据仓库工具(离线),可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。

 

 

1.2 为什么要使用Hive

  • 直接使用hadoop所面临的问题

人员学习成本太高

项目周期要求太短

MapReduce实现复杂查询逻辑开发难度太大

 

  • 为什么要使用Hive

操作接口采用类SQL语法,提供快速开发的能力。

避免了去写MapReduce,减少开发人员的学习成本。

功能扩展很方便。

 

1.3 Hive得特点

  • 可扩展

Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。

  • 延展性

Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

  • 容错

良好的容错性,节点出现问题SQL仍可完成执行。

 

2 hive的基本架构

Jobtracker是hadoop1.x中的组件,它的功能相当于:
Resourcemanager+MRAppMaster

TaskTracker 相当于:  
Nodemanager  +  yarnchild
 

 

3 Hive安装

最简安装:用内嵌derby作为元数据库
准备工作:安装hive的机器上应该有HADOOP环境(安装目录,HADOOP_HOME环境变量)
安装:直接解压一个hive安装包即可
此时,安装的这个hive实例使用其内嵌的derby数据库作为记录元数据的数据库
此模式不便于让团队成员之间共享协作


3.2.    标准安装:将mysql作为元数据库


3.2.1.    mysql安装

① 上传mysql安装包


② 解压:

[root@mylove ~]# tar -xvf MySQL-5.6.26-1.linux_glibc2.5.x86_64.rpm-bundle.tar 

 

③ 安装mysql的server包

[root@mylove ~]# rpm -ivh MySQL-server-5.6.26-1.linux_glibc2.5.x86_64.rpm 


PS:假如依赖报错:
缺perl
yum install perl
安装完perl后 ,继续重新安装mysql-server
(可以配置一个本地yum源进行安装:
1、先在vmware中给这台虚拟机连接一个光盘镜像
2、挂在光驱到一个指定目录:mount -t iso9660 -o loop /dev/cdrom /mnt/cdrom
3、将yum的配置文件中baseURL指向/mnt/cdrom

[root@mylove ~]# rpm -ivh MySQL-server-5.6.26-1.linux_glibc2.5.x86_64.rpm 


又出错:包冲突conflict with
移除老版本的冲突包:mysql-libs-5.1.73-3.el6_5.x86_64

[root@mylove ~]# rpm -e mysql-libs-5.1.73-3.el6_5.x86_64 --nodeps

继续重新安装mysql-server

[root@mylove ~]# rpm -ivh MySQL-server-5.6.26-1.linux_glibc2.5.x86_64.rpm 

成功后,注意提示:里面有初始密码及如何改密码的信息
初始密码:/root/.mysql_secret  
改密码脚本:/usr/bin/mysql_secure_installation

④ 安装mysql的客户端包:

[root@mylove ~]# rpm -ivh MySQL-client-5.6.26-1.linux_glibc2.5.x86_64.rpm

⑤ 启动mysql的服务端:

[root@mylove ~]# service mysql start
Starting MySQL. SUCCESS!


⑥ 修改root的初始密码:

[root@mylove ~]# /usr/bin/mysql_secure_installation  按提示

⑦ 测试:
用mysql命令行客户端登陆mysql服务器看能否成功

[root@mylove ~]# mysql -uroot -proot
mysql> show databases;

⑧ 给root用户授予从任何机器上登陆mysql服务器的权限:

mysql> grant all privileges on *.* to 'root'@'%' identified by '你的密码' with grant option;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)


注意点:要让mysql可以远程登录访问
最直接测试方法:从windows上用Navicat去连接,能连,则可以,不能连,则要去mysql的机器上用命令行客户端进行授权:
在mysql的机器上,启动命令行客户端: 

mysql -uroot -proot
mysql>grant all privileges on *.* to 'root'@'%' identified by 'root的密码' with grant option;
mysql>flush privileges;


 

3.2.2 hive的元数据库配置

vi conf/hive-site.xml

<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost: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.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>root</value>
<description>password to use against metastore database</description>
</property>
</configuration>

2、上传一个mysql的驱动jar包到hive的安装目录的lib中

3、配置HADOOP_HOME 和HIVE_HOME到系统环境变量中:/etc/profile
4、source /etc/profile
5、hive启动测试
然后用命令启动hive交互界面:   

[root@hdp20-04 ~]# hive

4 hive使用方式

4.1 最基本使用方式

启动一个hive交互shell

bin/hive

hive>

设置一些基本参数,让hive使用起来更便捷,比如:

1、让提示符显示当前库:

hive>set hive.cli.print.current.db=true;

2、显示查询结果时显示字段名称:

hive>set hive.cli.print.header=true;

但是这样设置只对当前会话有效,重启hive会话后就失效,解决办法:

在linux的当前用户目录中,编辑一个.hiverc文件,将参数写入其中:

vi .hiverc

set hive.cli.print.header=true;
set hive.cli.print.current.db=true;

4.2 启动hive服务使用

启动hive的服务:

[root@hdp20-04 hive-1.2.1]# bin/hiveserver2 -hiveconf hive.root.logger=DEBUG,console

上述启动,会将这个服务启动在前台,如果要启动在后台,则命令如下:

nohup bin/hiveserver2 1>/dev/null 2>&1 &


启动成功后,可以在别的节点上用beeline去连接
 方式(1)

[root@hdp20-04 hive-1.2.1]# bin/beeline  回车,进入beeline的命令界面


输入命令连接hiveserver2

beeline> !connect jdbc:hive2//mini1:10000


(minil是hiveserver2所启动的那台主机名,端口默认是10000)
方式(2)
启动时直接连接:

bin/beeline -u jdbc:hive2://mini1:10000 -n root

接下来就可以做正常sql查询了
 

4.3 脚本化运行

大量的hive查询任务,如果用交互式shell来进行输入的话,显然效率及其低下,因此,生产中更多的是使用脚本化运行机制:
该机制的核心点是:hive可以用一次性命令的方式来执行给定的hql语句

[root@hdp20-04 ~]#  hive -e "insert into table t_dest select * from t_src;"

然后,进一步,可以将上述命令写入shell脚本中,以便于脚本化运行hive任务,并控制、调度众多hive任务,示例如下:
vi t_order_etl.sh

#!/bin/bash
hive -e "select * from db_order.t_order"
hive -e "select * from default.t_user"
hql="create table  default.t_bash as select * from db_order.t_order"
hive -e "$hql"

如果要执行的hql语句特别复杂,那么,可以把hql语句写入一个文件:
vi x.hql

select * from db_order.t_order;
select count(1) from db_order.t_user;

然后,用hive -f /root/x.hql 来执行
 

5.    hive建库建表与数据导入


5.1.    建库


hive中有一个默认的库:
库名: default
库目录:hdfs://hdp20-01:9000/user/hive/warehouse

新建库:

create database db_order;


库建好后,在hdfs中会生成一个库目录:
hdfs://hdp20-01:9000/user/hive/warehouse/db_order.db

5.2.    建表


5.2.1.    基本建表语句

 

use db_order;
create table t_order(id string,create_time string,amount float,uid string);


表建好后,会在所属的库目录中生成一个表目录
/user/hive/warehouse/db_order.db/t_order
只是,这样建表的话,hive会认为表数据文件中的字段分隔符为 001

正确的建表语句为:

create table t_order(id string,create_time string,amount float,uid string)
row format delimited
fields terminated by ',';

这样就指定了,我们的表数据文件中的字段分隔符为 ","


5.2.2.    删除表

 

drop table t_order;


删除表的效果是:
hive会从元数据库中清除关于这个表的信息;
hive还会从hdfs中删除这个表的表目录;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值