Hive从入门到高级

目录

一、Hive的简介

1.1 出现的原因

1.2 hive是什么

1.3 Hive的优缺点

二、hive的框架原理(重点)

二、hive的框架原理(重点)

2.1 hive的框架结构

2.2 hive的运行原理

2.3 hive和hadoop的关系

2.4 Hive与关系型数据库的比较

三、hive的安装模式

3.3 远程模式

3.3.1 概念

3.3.2 hive的服务端的配置

3.3.3 服务项的启动操作

3.3.4 客户端连接hiveserver2

3.3.5 客户端连接metastore

四、HIVE的库和表操作

4.1 库操作

4.2 表操作

4.3 数据的导入(重点)

4.4 案例演示

4.5 数据的导出

五、hive的shell技巧(熟悉)

六、表类型的详解(重点)

6.1 表的分类

6.2 表类型的转换

6.3 两种表的区别

七、Hive的基本查询语句

7.1 查询原则:

7.2 在hive(2.1.1版本)中的注意事项:

7.3 exists的用法

7.4 left semi join

7.5 hive的日志

7.6 hql的运行方式

八、HIVE的数据类型

8.1 hive的基本数据类型

8.2 复杂类型之Array类型

8.3 展开函数explode的应用

8.4 搜集函数的应用

8.5 复杂类型之Map类型

8.6 复杂类型之struct类型

8.7 综合练习

九、HIVE的函数(重点)

9.1 常用的内置函数

9.2 高级函数之窗口函数over

9.3 over()函数的其他用法

9.4 window子句的作用

9.5 排名函数

9.6 其他序列函数

9.7 自定义函数


一、Hive的简介

1.1 出现的原因

 facebook团队要管理和分析大量的结构化的日志文件,因为写mapreduce非常麻烦,所以该团队就开发出来一个框架,叫hive.

1.2 hive是什么

 hive是一款运行在hadoop上的数据仓库管理工具,可以将具有结构化的数据文件映射成一张数据表,使用类似sql的方式来对这种文件进行读、写、管理(包括元数据)等。这种类sql的语言,称之为Hive SQL,简称HQL。 实际上hive底层是mapreduce或者是spark或者是tez.
 ​
 如果是mapreduce,则是将hql翻译成对应的mapreduce程序。

1.3 Hive的优缺点

 一、优点
    1. 学习成本低
    2. 扩展性好
    3. 适合做离线分析(OLAP)
    4. 容错性好(某一个节点宕机,hive依然可以完成)
    5. 延展性好(用户可以自定义hive函数)
    6. hive的元数据统一管理。
 二、缺点:
     1. hive的表达能力有限(特别复杂的算法难以实现)
     3. hive的效率低(调优不方便,速度慢)

二、hive的框架原理(重点)

二、hive的框架原理(重点)

2.1 hive的框架结构

 1. 用户接口层:  就是供用户链接hive的接口,有三类。
             - shell命令行接口
             - jdbc/odbc接口
             - webui接口
 2. Thrift server:hive的可选组件(第三方组件),供编程语言链接hive时使用。
 3. metaStore:元数据库
     用来存储hive的元数据的,元数据包括库名,表名,表字段,字段类型,表数据所在的目录等。
     注意:hive在工作时,会访问元数据库,可能是读取元数据,也可能是更改元数据。
 4. Driver: hive的驱动
      - 解析器: 解析hql语法
      - 编译器: 将没有问题的hql翻译成mr程序
      - 优化器: 对翻译好的mr程序进行部分优化(比如去掉不必要的列等)
      - 执行器: 提交mr程序job。

2.2 hive的运行原理

 1. 用户提交hql语句给Driver.
 2. Driver的解析器校验hql,然后传给编译器,由编译器翻译成mr执行计划。
 3. 编译器读取元数据库里的元数据
 4. 编译器获取元数据后,再次完善mr执行计划,比如设置输入路径等。
 5. 将完善后的mr执行计划交由driver。此时,整个解析和翻译过程结束。
 6. driver将执行计划交给执行引擎
 7. 执行引擎提交作业到yarn上,运行mr程序
 8. 运算结果交由执行引擎。
 9.执行引擎获取数据后,交给driver
 10.driver将结果传递给用户。

2.3 hive和hadoop的关系

 hive就像是在hadoop上的一个壳子。 hive要处理的数据存储在hdfs/hbase上。hive的计算基于mapreduce/spark/tez

2.4 Hive与关系型数据库的比较

 - mysql用自己的存储存储引擎,hive使用的hdfs来存储。
 - mysql使用自己的执行引擎,而hive使用的是mapreduce来执行。
 - mysql使用环境几乎没有限制,hive是基于hadoop的。
 - mysql的低延迟,hive是高延迟。
 - mysql的handle的数据量较小,而hive的能handle数据量较大。
 - mysql的可扩展性较低,而hive的扩展性较高。
 - mysql的数据存储格式要求严格,而hive对数据格式不做严格要求。
 - mysql可以允许局部数据插入、更新、删除等,而hive不支持局部数据的操作。

三、hive的安装模式

3.2.1

元数据库是关系型数据库mysql,hive的相关进程都在同一台机器上,与mysql在哪一台机器上无关。
注意:hive在启动客户端时,会内置的自动启动一个元数据服务项。

3.2.2安装步骤

步骤1:上传,解压,更名,配置环境变量

步骤2: 修改hive-env.sh

如果不存在,就用hive.env.sh.template复制一个

export HIVE_CONF_DIR=/usr/local/hive/conf  
export JAVA_HOME=/usr/local/jdk  export HADOOP_HOME=/usr/local/hadoop  
export HIVE_AUX_JARS_PATH=/usr/local/hive/lib

步骤3: 修改hive-site.xml

hive2.1.1中默认是没有hive-site.xml,可以把conf/hive-default.xml.template拷贝过来使用


<!--配置mysql的连接字符串-->
<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://qianfeng03:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<!--配置mysql的连接驱动-->
<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
</property>
<!--配置登录mysql的用户-->
<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
</property>
<!--配置登录mysql的密码,注意,注意,注意,要用自己的远程密码-->
<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>@Mmforu45</value>
</property>

<!-- 该参数主要指定Hive的数据存储目录  -->
<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
</property>

<!-- 该参数主要指定Hive的临时文件存储目录  -->
<property>
    <name>hive.exec.scratchdir</name>
    <value>/tmp/hive</value>
</property>

<!--     一些临时文件夹的配置   -->
<property>
    <name>hive.exec.local.scratchdir</name>
    <value>/usr/local/hive/iotmp</value>
</property>
<property>
    <name>hive.downloaded.resources.dir</name>
    <value>/usr/local/hive/iotmp/${hive.session.id}_resources</value>
</property>
<property>
    <name>hive.querylog.location</name>
    <value>/usr/local/hive/iotmp/root</value>
</property>
<property>
    <name>hive.server2.logging.operation.log.location</name>
    <value>/usr/local/hive/iotmp/root/operation_logs</value>
</property>
<!-- 是否显示当前数据库名-->
<property>
    <name>hive.cli.print.current.db</name>
    <value>true</value>
</property>
<!-- 该参数指定翻译出来的mr程序是使用yarn调度工具,还是本地OS调度工具,true表示local运行mr-->
<property>
    <name>hive.exec.mode.local.auto</name>
    <value>true</value>
</property>

 

步骤4: 导入mysql的驱动包到hive的lib目录下

mysql-connector-XXX.jar

步骤5:初始化元数据库

schematool -initSchema -dbType mysql

 hive

 

3.3 远程模式

3.3.1 概念

 hive的服务项进程必须单独启动,服务项有两个,一个是hiveserver2,一个是metastore。 启动哪一个都可以,注意启动hiveserver2时,其本质还是在内部启动了metastore

3.3.2 hive的服务端的配置



<!--配置mysql的连接字符串-->
<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://qianfeng03:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<!--配置mysql的连接驱动-->
<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
</property>
<!--配置登录mysql的用户-->
<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
</property>
<!--配置登录mysql的密码,注意,注意,注意,要用自己的远程密码-->
<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>@Mmforu45</value>
</property>

<!-- 该参数主要指定Hive的数据存储目录  -->
<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
</property>

<!-- 该参数主要指定Hive的临时文件存储目录  -->
<property>
    <name>hive.exec.scratchdir</name>
    <value>/tmp/hive</value>
</property>

<!--     一些临时文件夹的配置   -->
<property>
    <name>hive.exec.local.scratchdir</name>
    <value>/usr/local/hive/iotmp</value>
</property>
<property>
    <name>hive.downloaded.resources.dir</name>
    <value>/usr/local/hive/iotmp/${hive.session.id}_resources</value>
</property>
<property>
    <name>hive.querylog.location</name>
    <value>/usr/local/hive/iotmp/root</value>
</property>
<property>
    <name>hive.server2.logging.operation.log.location</name>
    <value>/usr/local/hive/iotmp/root/operation_logs</value>
</property>
<!-- 是否显示当前数据库名-->
<property>
    <name>hive.cli.print.current.db</name>
    <value>true</value>
</property>
<!-- 该参数指定翻译出来的mr程序是使用yarn调度工具,还是本地OS调度工具,true表示local运行mr-->
<property>
    <name>hive.exec.mode.local.auto</name>
    <value>true</value>
</property>

注意:如果使用远程模式连接服务项。那么必须修改hadoop的core-site.xml文件,追加以下两个属性

<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property> 

要scp到其他节点上,还要重启HDFS,使配置生效。

3.3.3 服务项的启动操作

启动hiveserver2:
        方法1:
            直接调用hiveserver2。会进入监听状态不退出。
        方法2:
            hive --service hiveserver2 & 进入后台启动
        方法3:
               hive --service hiveserver2 2>&1 >/dev/null &; #信息送入黑洞。

启动metastore:
        方法1:
            - hive --service metastore &
        方法2:
            - hive --service metastore 2>&1 >/dev/null &; #信息送入黑洞。

3.3.4 客户端连接hiveserver2

如果启动的是hiveserver2服务项,必须使用beeline工具连接。



方式1:
       step1. beeline 回车
       step2. !connect jdbc:hive2://ip:10000 回车
       step3. 输入用户名 回车
       step4. 输入密码 回车
方法2(直连):
    1. beeline -u jdbc:hive2://qianfeng01:10000 -n root     #我一直使用!

解析:
    hive2,是hive的协议名称
    ip:  hiveserver2服务所在的主机IP。
    10000,是hiveserver2的端口号

 

3.3.5 客户端连接metastore

想要连接metastore服务的客户端必须配置如下属性和属性值

 <property>
     <name>hive.metastore.uris</name> 
     <value>thrift://ip:9083</value>
 </property>
 ​
 解析:thrift:是协议名称
      ip为metastore服务所在的主机ip地址
      9083是默认端口号

配置完,直接使用hive指令即可

四、HIVE的库和表操作

命名规范

 1. 名字可以由字母,数字等构成,数字不能开头
 2. 不区分大小写
 3. 不能使用关键字,不要使用特殊符号

4.1 库操作

1)库的创建语法

create database dbName; 
create database if not exists dbName;  
create database [if not exists] dbName comment '备注信息';

注意: hive的库的本质,是在hdfs上的一个目录,目录名为dbName.db

2) 库的查看语法

查看所有数据库:
show databases;
查看某一个数据库的信息
desc database dbName
desc database extended dbName;
显示创建语法
show create database dbName;

 

注意: hive的库的本质,是在hdfs上的一个目录,目录名为dbName.db

 

3) 库的切换语法

 use dbName

4)库的删除语法

 drop if database dbName;   只能删除没有表的空库
 drop  database dbName cascade;  可以强制删除有表的库

4.2 表操作

1)常用的字段类型

 int
 float
 double
 string
 varchar
 char
 date
 timestamp

2)表的创建语法(重点)

create table tableName(
fieldName1 Type,
fieldName1 Type,
....
);

create table dbName.tableName(
fieldName1 Type,
fieldName1 Type,
    .....
);


create table [if not exists] tableName(
fieldName1 Type,
fiedlName2 Type comment '备注',
.......
)
comment 'this is my table'       --表备注
row format delimited             --规定输入规则,以及切分规则
fields terminated by '\t'        --列分隔符,默认值是^A
lines terminated by '\n'         --行分隔符,也是默认值
stored as textfile;              --指定表对应的文件是什么存储格式,textfile,也是默认值

注意:hive的表的本质,是在库目录下的子目录,目录名为表名。

3)表的查看语法

查看库里的所有的表  show tables;  ​
查看某一个表的结构  desc tableName;  
                   desc extended tableName;  ​  
查看建表语句  show create table tableName

4)表的结构修改语法

 

- 修改表名
    alter table oldTableName rename to newTableName;
- 修改列名、修改列类型是同一个语法
    alter table tableName change column oldColumnName newColumnName [Type|newType]
 
  注意:在修改类型时,不能将大类型转成小类型,可以使用小类型转向大类型。
- 修改列的位置:  注意,2.x版本后,必须是相同类型进行移动位置。
    alter table tableName change column colName colName colType after colName1;   
    alter table tableName change column colName colName colType first;

- 增加字段:add columns
    alter table tableName add columns (sex int,...);

- 删除字段:replace columns    #注意,2.x版本后,注意类型的问题,替换操作,其实涉及到位置的移动问题。
    alter table tableName replace columns(
    id int,
    name int,
    size int,
    pic string
    );
    注意:实际上是保留小括号内的字段。   

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值