hive为什么需要mysql hive为什么需要创建库_hive为什么需要mysql

Hive数据仓库



1.什么是Hive

Hive是基于Hadoop的一个数据仓库工具,主要是用于离线分析,它可以将结构化的数据文件映射成一张数据库表,并提供类SQL查询的功能。

2.使用Hive带来的好处

  • 直接使用Hadoop人员学习成本太高,学习周期长
  • 一般项目的周期太短,直接使用Hadoop底层开发过于复杂,很难在项目周期内完成。
  • 降低了数据处理的便捷性与门槛,传统的Mapreduce对开发人员要求高,掌握的技能复杂,而Hive使用类SQL,使传统数据库开发人员能在短期内上手。

3.Hive的安装与配置

有关Hive的安装与配置,请参考另外一篇文章:

Spark大数据系列:二十五、详解Hive的安装与配置

4.Hive的使用

  • 4.1.交互式访问

在Hive的客户端启动hive(已经配置好了Hive的环境变量), 即可进入Hive的交互模式:

[hadoop@node03 ~]$ hive

小技巧:

1.在交互式窗口中显示当前数据库(也可以配置在hive-site.xml中使其永久生效)

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

2.设置查询结果显示列头

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

如果你使用的是linux, 也可以在用户主目录下编辑|新建.hiverc文件,将下面的参数存入该文件中:

cd ~vi .hiverc# 添加下面记录set hive.cli.print.header=true;set hive.cli.print.current.db=true;
  • 4.2.启动HiveServer2服务远程访问
[hadoop@node01 ~]$ $HIVE_HOME/bin/hiveserver2 1>/dev/null 2>&1

然后通过beeline访问:

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

5.Hive创建数据库

hive> create database mydb;OKTime taken: 0.294 secondshive> show databases;OKdefaultmydb

在MySQL元数据库中就生成了对应的记录,如下图所示:




hive为什么需要mysql hive为什么需要创建库_hive 分区表_02

MySQL元数据



查看HDFS的WebUI, 也可以看出在HDFS相应目录下生成了文件:




hive为什么需要mysql hive为什么需要创建库_hive 分区表_03

HDFS WEBUI



6.建表

  • 6.1.基本创建表语句
# 1.使用上面创建的数据库hive> use mydb;OKTime taken: 0.195 seconds# 2.创建一张表, 默认创建的是内部表(managed table)hive> create table t_order(id string, creation_time string, amount float, user_id string) row format delimited fields terminated by ',';OKTime taken: 0.93 secondshive> show tables;OKt_orderTime taken: 0.098 seconds, Fetched: 1 row(s)# 3.删除表使用hive> drop table t_order;
  • 6.2.内部表和外部表
  • 内部表(Managed Table)

内部表(managed table): 表目录按照Hive的规划来部署,位于Hive的配置文件中指定的目录/user/hive/warehosue中。

  • 外部表(External Table)

外部表(external table): 表目录由建表用户自己指定。相对于内部表,数据不在自己的数据仓库中,只保存数据的源信息

# 创建外部表create external table t_logs(ip string, url string, action_time string)row format delimitedfields terminated by ','location '/user/hadoop/logs/access.log';
  • 6.3.内部表和外部表的区别
  • 内部表的目录在hive的仓库目录中,外部表的目录由用户指定;
  • drop一个内部表时,hive会清除相关元数据,并删除表数据目录;
  • drop一个外部表时,hive只会清除相关元数据;

基于Hive的数据仓库,最底层的表,一定是来自外部系统,为了不影响外部系统的工作逻辑,在Hive中创建external表来映射这些外部系统产生的数据目录,然后后续的ETL操作,产生的各种表建议用内部表managed_table来管理。

7.创建分区表

分区表的实质是:在表目录中为数据文件创建分区子目录,以便于在查询时,MR程序可以针对分区子目录中的数据进行处理,缩减读数据的范围。

比如,网站每天产生的浏览记录,浏览记录应该建一个表来存放,但是,有的时候,我们可能只需要对某一天的浏览记录进行分析,这时,就可以将这个表建为分区表,每天的数据导入其中的一个分区。

当然,每日的分区目录,应该有一个目录名(分区字段)

# 创建分区表hive> create table t_application_pv(ip string, url string, action_time string)partitioned by (day string)row format delimitedfields terminated by ',';# 向分区表中导入本地数据(不加local表示hdfs路)hive> load data local inpath '/home/hadoop/pv_log.20200520'      into table t_application_pv      partition(day='2020-05-20');# 针对分区进行查询hive> select count(*) from t_application_pv where day='2020-05-20';                   # 多个分区字段hive> create table t_employee(id int, name string, age int)      partitioned by(department string, gender string)      row format delimited      fields terminated by ',';# 导入本地数据hive> load data local inpath '/home/hadoop/employee.csv' overwriteinto table t_employee(department='销售', gender='男');

8.CTAS建表语法

CTAS语法是通过已有的表来创建新表

# 创建与表t_employee结构一样的表, 只是复制表结构,不包含数据hive> create table t_employee_alias like t_employee;# 通过t_employee表创建表,包含数据hive> create table t_employee_info as select id, name from t_employee;

9.Hive中数据的导入

  • 9.1.手动用hdfs命令移动文件

使用hive的HQL建表语句创建好表,然后将文件通过hdfs命令的方式移动到hive数据仓库的目录下。

  • 9.2.在hive的交互窗口shell中用hive命令导入本地的数据至Hive表的目录中
hive> load data local inpath '/home/hadoop/order.csv' overwrite into table t_order;
  • 9.3.用hive命令导入hdfs中数据文件到表目录(文件会发生移动)
hive> load data inpath '/user/hadoop/order.csv' overwrite into table t_order;