当前位置:   article > 正文

Apache Hive详解

apache hive

目录

一、引入

Hive简介

为什么要使用Hive

Hive的特点

Hive的发展历程

二、Hive架构体系

三、MySQL安装

安装准备

安装

​卸载(了解)

四、Hive集群搭建

准备工作

安装过程

五、Hive的MySQL元数据库与表

六、Hive库操作

七、Hive表操作

八、Hive查询结果四大排序

九、Hive函数

内置函数

关系运算符

算术运算符

逻辑运算符

复数运算符

Hive常用内置函数


一、引入

Hive简介

hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。Hive的优点是学习成本低,可以通过类似SQL语句实现快速MapReduce统计,使MapReduce变得更加简单,而不必开发专门的MapReduce应用程序。hive十分适合对数据仓库进行统计分析。

我们可以将hive想象成mysql,他就是对hdfs存储的数据进行增删改查的。

比如要计算user.txt中用户们出现了几次,我们来看看hive的实现过程:

为什么要使用Hive

为什么不直接使用Hadoop

  • 人员学习成本高
  • 项目要求周期短
  • MapReduce实现复杂查询逻辑开发难度大

为什么使用Hive

  • 操作接口采用SQL语法,提供快速开发能力
  • 免去了写MapReduce,减少开发人员学习成本
  • 功能扩展很方便

Hive的特点

  • hive延迟高,适合高吞吐量,批量,海量数据处理
  • 语法和SQL相似,学习成本低,避免去写复杂的MapReduce,缩短开发周期
  • Hive支持自由的扩展集群的规模,一般不需要重启服务
  • Hive支持自定义函数,用户可以根据自己的需求去定义函数
  • 良好的容错性,节点出现问题,SQL仍然可以成功执行

Hive的发展历程

在Hive的发展历程中,不得不提的就是Stinger

Stinger不是一个项目或产品,而是一种提议,旨在将Hive性能提升100倍,包括Hive的改进和Tez项目两个部分。

Stinger分了几个阶段来做:Phase 1、2、3 ,Stringer.next;这几个阶段对Hive性能的提升是非常至关重要的

07/08 facebook
13/05 hive-0.11 Stinger Phase 1 加入了ORC/HiveServer2
13/10 hive-0.12 Stinger Phase 2 ORC improvement(对ORC做了些改善)
14/04 hive-0.13 Stinger Phase 3 Tez/Vectorized query engine(加入了Tez和支持向量化的查询)
14/11 hive-0.14 Stinger.next Phase 1 Cost-based optimizer(Cost-based简称CBO) (Cost-based的优化 很牛逼 算法各方面的优化 Spark现在也在做)
…… …….
当时有一句话:The Stinger Initiative making Apache Hive 100 times faster

二、Hive架构体系

 Hive的体系结构主要分为以下几个部分:

  • 用户接口
    • 用户接口主要有三个:CLI,Client 和 WUI。其中最常用的是 Cli,Cli 启动的时候,会同时启动一个 hive 副本。Client 是 hive 的客户端,用户连接至 hive Server。在启动 Client 模式的时候,需要指出 hive Server 所在节点,并且在该节点启动 hive Server。 WUI 是通过浏览器访问 hive。
  • 元数据存储
    • hive 将元数据存储在数据库中,如 mysql、derby。hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
  • 解释器、编译器、优化器、执行器
    • 解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后由 MapReduce 调用执行。
  • Hadoop
    • hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成(不包含 * 的查询,比如 select * from tbl 不会生成 MapReduce 任务)。

三、MySQL安装

为什么学Hive还要安装MySQL:

  • metastore是hive元数据的集中存放地
  • metastore默认使用内嵌的derby数据库作为存储引擎
    • 但是你在哪路径下,执行hive指令,就在哪路径下生成metastore_db。建一套数据库文件,这样是极其不合适的,公司里每个人若不一样,则会显得非常混杂。导致员工之间无法公用交流。
  • Derby引擎的缺点:一次只能打开一个会话
  • 使用Mysql作为外置存储引擎,多用户同时访问

hive只是个工具,包括它的数据分析,依赖于mapreduce,它的数据管理,依赖于外部系统;

Hive提供了增强配置,可将数据库替换成mysql等关系型数据库,将存储数据独立出来在多个服务示例之间共享。

这也是为什么,在安装hive时,也需要配置mysql了。

安装准备

  • 1、检查是否已经安装过mysql,执行命令
    • rpm -qa | grep mysql
    • 如果已存在,则执行删除命令 后边为Mysql目录
      • rpm -e --nodeps mysql-xxxx
  • 2、查询所有Mysql对应的文件夹
    • whereis mysqlm
    • find / -name mysql
    • 删除相关目录或文件
      • rm -rf /usr/bin/mysql /usr/include/mysql /data/mysql /data/mysql/mysql 
    • 验证是否删除完毕
      • whereis mysqlm
      • find / -name mysql

确保先执行以下命令:

systemctl stop firewalld    #关闭防火墙

安装perl与net-tools依赖

        1:yum install net-tools -y

        2:yum install perl* -y

安装

下载地址:MySQL :: Download MySQL Community Server

上传安装包后创建目录放置解压包:mkdir /opt/mysql

解压:tar -xvf mysql-8.0.26-1.el7.x86_64.rpm-bundle.tar -C /opt/mysql

可以看到解压后的文件都是 rpm 文件,所以需要用到 rpm 包资源管理器相关的指令安装这些 rpm 的安装包

在安装执行 rpm 安装包之前先下载 openssl-devel 插件,因为 mysql 里面有些 rpm 的安装依赖于该插件。

yum install openssl-devel

 安装完该插件之后,依次执行以下命令安装这些 rpm 包

  • rpm -ivh mysql-community-common-8.0.26-1.el7.x86_64.rpm
  • rpm -ivh mysql-community-client-plugins-8.0.26-1.el7.x86_64.rpm
  • rpm -e mariadb-libs --nodeps    #解决下一行代码可能会出现的依赖检测失败错误
  • rpm -ivh mysql-community-libs-8.0.26-1.el7.x86_64.rpm
  • rpm -ivh mysql-community-libs-compat-8.0.26-1.el7.x86_64.rpm
  • rpm -ivh mysql-community-devel-8.0.26-1.el7.x86_64.rpm
  • rpm -ivh mysql-community-client-8.0.26-1.el7.x86_64.rpm
  • rpm -ivh mysql-community-server-8.0.26-1.el7.x86_64.rpm

在 Linux 中 MySQL 安装好了之后系统会自动的注册一个服务,服务名称叫做 mysqld,所以可以通过以下命令操作 MySQL:

  • 启动 MySQL 服务:systemctl start mysqld
  • 重启 MySQL 服务:systemctl restart mysqld
  • 关闭 MySQL 服务:systemctl stop mysqld

启动服务:systemctl start mysqld

现在我们就可以登录MySQL了,但是登录MySQL需要密码对不对,不要慌,rpm 安装 MySQL 会自动生成一个随机密码,可在 /var/log/mysqld.log 这个文件中查找该密码(切记:如果之前你的机器上mysql没有删除干净,现在这个文件就是空的):

 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: HONhF9oMf.ik

我这里生成的随机密码是HONhF9oMf.ik

登录:
mysql -u root -p

我们先修改密码(在当前登录成功页执行代码):

# 将密码复杂度校验调整简单类型
set global validate_password.policy=0;        #分号不可少
# 设置密码最少位数限制为 4 位
set global validate_password.length=4;        #分号不可少

# 设置新密码

ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';       #分号不可少

修改 mysql 库下的 user 表中的 root 用户允许任意 ip 连接

update mysql.user set host='%' where user='root';

 flush privileges;    #重新加载权限表

卸载(了解)

卸载 MySQL 前需要先停止 MySQL

命令:systemctl stop mysqld

停止 MySQL 之后查询 MySQL 的安装文件:rpm -qa | grep -i mysql

 卸载上述查询出来的所有的 MySQL 安装包

  1. rpm -e mysql-community-client-plugins-8.0.26-1.el7.x86_64 --nodeps
  2. rpm -e mysql-community-server-8.0.26-1.el7.x86_64 --nodeps
  3. rpm -e mysql-community-common-8.0.26-1.el7.x86_64 --nodeps
  4. rpm -e mysql-community-libs-8.0.26-1.el7.x86_64 --nodeps
  5. rpm -e mysql-community-client-8.0.26-1.el7.x86_64 --nodeps
  6. rpm -e mysql-community-libs-compat-8.0.26-1.el7.x86_64 --nodeps

删除MySQL的数据存放目录

rm -rf /var/lib/mysql/

删除MySQL的配置文件备份

rm -rf /etc/my.cnf.rpmsave

四、Hive集群搭建

准备工作

注:在Hive集群搭建之前需完成Hadoop-HDFS详解与HA,完全分布式集群搭建(细到令人发指的教程)

下载hive安装包:Index of /dist/hive

下载mysql连接java驱动:Download mysql-connector-java-5.1.23-bin.jar : mysql « m « Jar File Download

这里以apache-hive-3.1.2-bin.tar.gz 为例;

 将压缩包上传至node001节点上

安装过程

解压安装包

解压:tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/

重命名:mv /opt/apache-hive-3.1.2-bin/ /opt/hive-3.1.2

配置环境变量

终端输入:vim /etc/profile   

末行加入:

  1. export HIVE_HOME=/opt/hive-3.1.2
  2. export PATH=$PATH:$HIVE_HOME/bin:$HIVE_HOME/sbin

source /etc/profile   

hive-env.sh 

终端输入:vim /opt/hive-3.1.2/conf/hive-env.sh 

末行加入:

  1. export HADOOP_HOME=/opt/hadoop-3.1.2
  2. export HIVE_CONF_DIR=/opt/hive-3.1.2/conf
  3. export HIVE_AUX_JARS_PATH=/opt/hive-3.1.2/lib

hive-site.xml

终端输入:vim /opt/hive-3.1.2/conf/hive-site.xml

 添加配置:

  1. <configuration>
  2. <!--数据库连接配置-->
  3. <property>
  4. <name>javax.jdo.option.ConnectionURL</name>
  5. <value>jdbc:mysql://node001:3306/hive?createDatabaseIfNotExist=true</value>
  6. </property>
  7. <!--数据库连接驱动-->
  8. <property>
  9. <name>javax.jdo.option.ConnectionDriverName</name>
  10. <value>com.mysql.jdbc.Driver</value>
  11. </property>
  12. <!--数据库连接用户名-->
  13. <property>
  14. <name>javax.jdo.option.ConnectionUserName</name>
  15. <value>root</value>
  16. </property>
  17. <!--数据库连接密码-->
  18. <property>
  19. <name>javax.jdo.option.ConnectionPassword</name>
  20. <value>123456</value>
  21. </property>
  22. <property>
  23. <name>datanucleus.schema.autoCreateAll</name>
  24. <value>true</value>
  25. </property>
  26. <property>
  27. <name>hive.metastore.schema.verification</name>
  28. <value>false</value>
  29. </property>
  30. <!--美化打印数据-->
  31. <property>
  32. <name>hive.cli.print.header</name>
  33. <value>true</value>
  34. </property>
  35. <property>
  36. <name>hive.cli.print.current.db</name>
  37. <value>true</value>
  38. </property>
  39. <!--hive server-->
  40. <property>
  41. <name>hive.server2.webui.host</name>
  42. <value>node001</value>
  43. </property>
  44. <property>
  45. <name>hive.server2.webui.port</name>
  46. <value>10002</value>
  47. </property>
  48. <!--数据存储位置-->
  49. <property>
  50. <name>hive.metastore.warehouse.dir</name>
  51. <value>/hive/warehouse</value>
  52. </property>
  53. </configuration>

配置日志组件

首先添加放置日志文件的目录:mkdir -p /opt/hive-3.1.2/logs

复制log4j模板文件:

cp /opt/hive-3.1.2/conf/hive-log4j2.properties.template hive-log4j2.properties

终端输入:vim /opt/hive-3.1.2/conf/hive-log4j2.properties

将/opt/hive-3.1.2/logs添加到property.hive.log.dir

core-site.xml

终端输入:vim /opt/hadoop-3.1.2/etc/hadoop/core-site.xml

添加配置:

  1. <!--这个参数表示可以通过httpfs接口hdfs的ip地址限制-->
  2. <property>
  3. <name>hadoop.proxyuser.root.hosts</name>
  4. <value>*</value>
  5. </property>
  6. <!--这个参数表示可以通过httpfs接口访问的用户获得的群组身份-->
  7. <property>
  8. <name>hadoop.proxyuser.root.groups</name>
  9. <value>*</value>
  10. </property>

添加驱动包

MySQL驱动

mysql-connector-java-5.1.23-bin.jar.zip,下载地址见上文

将其上传到/opt/hive-3.1.2/lib目录

执行:unzip mysql-connector-java-5.1.23-bin.jar.zip    #进行解压

Guava包

删除hadoop中guava-*.jar包

rm -rf /opt/hadoop-3.1.2/share/hadoop/common/lib/guava*

rm -rf /opt/hadoop-3.1.2/share/hadoop/hdfs/lib/guava*

将Hive的Guava拷贝给hadoop

cp /opt/hive-3.1.2/lib/guava-19.0.jar /opt/hadoop-3.1.2/share/hadoop/common/lib/

cp /opt/hive-3.1.2/lib/guava-19.0.jar /opt/hadoop-3.1.2/share/hadoop/hdfs/lib/

分发

拷贝hive到其他节点

scp -r /opt/hive-3.1.2/ node002:/opt/

scp -r /opt/hive-3.1.2/ node003:/opt/

拷贝profile到其他节点

scp /etc/profile node002:/etc/

scp /etc/profile node003:/etc/

ssh root@node002 "source /etc/profile"

ssh root@node003 "source /etc/profile"

拷贝core-site.xml到其他节点

scp /opt/hadoop-3.1.2/etc/hadoop/core-site.xml node002:/opt/hadoop-3.1.2/etc/hadoop/

scp /opt/hadoop-3.1.2/etc/hadoop/core-site.xml node003:/opt/hadoop-3.1.2/etc/hadoop/

guava

进入node002节点

# 删除hadoop中guava-*.jar包

[root@node002 ~]# rm -rf /opt/hadoop-3.1.2/share/hadoop/common/lib/guava*
[root@node002 ~]# rm -rf /opt/hadoop-3.1.2/share/hadoop/hdfs/lib/guava*

# 将Hive的Guava拷贝给hadoop

[root@node002 ~]# cp /opt/hive-3.1.2/lib/guava-19.0.jar /opt/hadoop-3.1.2/share/hadoop/common/lib/
[root@node002 ~]# cp /opt/hive-3.1.2/lib/guava-19.0.jar /opt/hadoop-3.1.2/share/hadoop/hdfs/lib/

guava

进入node003节点

# 删除hadoop中guava-*.jar包

[root@node003 ~]# rm -rf /opt/hadoop-3.1.2/share/hadoop/common/lib/guava*
[root@node003 ~]# rm -rf /opt/hadoop-3.1.2/share/hadoop/hdfs/lib/guava*

# 将Hive的Guava拷贝给hadoop

[root@node003 ~]# cp /opt/hive-3.1.2/lib/guava-19.0.jar /opt/hadoop-3.1.2/share/hadoop/common/lib/
[root@node003 ~]# cp /opt/hive-3.1.2/lib/guava-19.0.jar /opt/hadoop-3.1.2/share/hadoop/hdfs/lib/

客户端配置文件

修改node002与node003的hive-site.xml

如果不修改将会造成脑裂。

终端输入:vim /opt/hive-3.1.2/conf/hive-site.xml

修改为:

  1. <configuration>
  2. <property>
  3. <name>datanucleus.schema.autoCreateAll</name>
  4. <value>false</value>
  5. </property>
  6. <property>
  7. <name>hive.metastore.schema.verification</name>
  8. <value>false</value>
  9. </property>
  10. <!--美化打印数据-->
  11. <property>
  12. <name>hive.cli.print.header</name>
  13. <value>true</value>
  14. </property>
  15. <property>
  16. <name>hive.cli.print.current.db</name>
  17. <value>true</value>
  18. </property>
  19. <!--hive server-->
  20. <property>
  21. <name>hive.server2.webui.host</name>
  22. <value>node001</value>
  23. </property>
  24. <property>
  25. <name>hive.server2.webui.port</name>
  26. <value>10002</value>
  27. </property>
  28. <!--数据存储位置-->
  29. <property>
  30. <name>hive.metastore.warehouse.dir</name>
  31. <value>/hive/warehouse</value>
  32. </property>
  33. <property>
  34. <name>hive.metastore.uris</name>
  35. <value>thrift://node001:9083</value>
  36. </property>
  37. </configuration>

初始化元数据(很重要)

schematool -initSchema -dbType mysql

使用测试

在启动hive之前确保先启动zookeeper与Hadoop集群

启动:Hive服务

node001输入:hive --service metastore

node002或者node003输入:hive

node002或node003执行:show databases;  进行测试

到此hive搭建成功!

五、Hive的MySQL元数据库与表

 hive这个数据库并不是自动创建的而是通过上文hive-site.xml配置文件所决定的。

  1. <property>
  2. <name>javax.jdo.option.ConnectionURL</name>
  3. <value>jdbc:mysql://node001:3306/hive?createDatabaseIfNotExist=true</value>
  4. </property>

 通过show tables; 可以看到hive自动创建的一些表

  1. mysql> show tables;
  2. +-------------------------------+
  3. | Tables_in_hive |
  4. +-------------------------------+
  5. | AUX_TABLE |
  6. | BUCKETING_COLS |
  7. | CDS |
  8. | COLUMNS_V2 |
  9. | COMPACTION_QUEUE |
  10. | COMPLETED_COMPACTIONS |
  11. | COMPLETED_TXN_COMPONENTS |
  12. | CTLGS |
  13. | DATABASE_PARAMS |
  14. | DBS |
  15. | DB_PRIVS |
  16. | DELEGATION_TOKENS |
  17. | FUNCS |
  18. | FUNC_RU |
  19. | GLOBAL_PRIVS |
  20. | HIVE_LOCKS |
  21. | IDXS |
  22. | INDEX_PARAMS |
  23. | I_SCHEMA |
  24. | KEY_CONSTRAINTS |
  25. | MASTER_KEYS |
  26. | MATERIALIZATION_REBUILD_LOCKS |
  27. | METASTORE_DB_PROPERTIES |
  28. | MIN_HISTORY_LEVEL |
  29. | MV_CREATION_METADATA |
  30. | MV_TABLES_USED |
  31. | NEXT_COMPACTION_QUEUE_ID |
  32. | NEXT_LOCK_ID |
  33. | NEXT_TXN_ID |
  34. | NEXT_WRITE_ID |
  35. | NOTIFICATION_LOG |
  36. | NOTIFICATION_SEQUENCE |
  37. | NUCLEUS_TABLES |
  38. | PARTITIONS |
  39. | PARTITION_EVENTS |
  40. | PARTITION_KEYS |
  41. | PARTITION_KEY_VALS |
  42. | PARTITION_PARAMS |
  43. | PART_COL_PRIVS |
  44. | PART_COL_STATS |
  45. | PART_PRIVS |
  46. | REPL_TXN_MAP |
  47. | ROLES |
  48. | ROLE_MAP |
  49. | RUNTIME_STATS |
  50. | SCHEMA_VERSION |
  51. | SDS |
  52. | SD_PARAMS |
  53. | SEQUENCE_TABLE |
  54. | SERDES |
  55. | SERDE_PARAMS |
  56. | SKEWED_COL_NAMES |
  57. | SKEWED_COL_VALUE_LOC_MAP |
  58. | SKEWED_STRING_LIST |
  59. | SKEWED_STRING_LIST_VALUES |
  60. | SKEWED_VALUES |
  61. | SORT_COLS |
  62. | TABLE_PARAMS |
  63. | TAB_COL_STATS |
  64. | TBLS |
  65. | TBL_COL_PRIVS |
  66. | TBL_PRIVS |
  67. | TXNS |
  68. | TXN_COMPONENTS |
  69. | TXN_TO_WRITE_ID |
  70. | TYPES |
  71. | TYPE_FIELDS |
  72. | VERSION |
  73. | WM_MAPPING |
  74. | WM_POOL |
  75. | WM_POOL_TO_TRIGGER |
  76. | WM_RESOURCEPLAN |
  77. | WM_TRIGGER |
  78. | WRITE_SET |
  79. +-------------------------------+
  80. 74 rows in set (0.00 sec)

​Hive元数据中一些重要的表结构与用途:方便impala,SparkSQL,Hive等组件访问元数据库的理解。

1、存储Hive版本的元数据表(VERSION)

  • 该表结构简单却是很重要的
  • 如果该表出现问题,根本进入不了Hive-Cli,当该表不存在的情况,就会报错"Table 'hive.version' doesn't exist"
  • 该表中数据只能有一条,如果存在多条,会造成hive启动不起来

表结构如下:

字段名说明示例数据
VER_IDID主键1
SCHEMA_VERSIONhive版本1.1.1
VERSION_COMMENT版本说明Updated the data

2、Hive数据库相关的元数据表(DBS、DATABASE_PARAMS)

DBS:数据库表

  • 该表存储Hive中所有数据库的基本信息

表结构如下:

字段名说明示例数据
DB_ID数据库ID1
CTLG_NAME目录名hive
DESC数据库描述Default Hive database
DB_LOCATION_URI数据HDFS路径hdfs://bdp/hive/warehouse
NAME数据库名default
OWNER_NAME所有者名称public
OWNER_TYPE所有者角色ROLE

DATABASE_PARAMS:该表存储数据库的相关参数,在CREATE DATABASE时候用WITH DBPROPERTIES(property_name=property_value, …)指定的参数。

表结构如下:

字段名称说明示例数据
DB_ID数据库ID1
PARAM_KEY参数名createdby
PARAM_VALUE参数值root

DBS和DATABASE_PARAMS这两张表通过DB_ID字段关联。

3、Hive数据表相关的元数据表

主要有TBLS、TABLE_PARAMS、TBL_PRIVS,这三张表通过TBL_ID关联。

TBLS:该表中存储Hive表,视图,索引表的基本信息

表结构如下:

字段名说明示例数据
TBL_ID表ID1
CREATE_TIME创建时间5678542364
DB_ID数据库ID2(对应DBS中DB_ID)
LAST_ACCESS_TIME最后访问时间6485123468
OWNER所有者root
OWNER_TYPE使用者角色ROLE
RETENTION保留字段0
IS_REWRITE_ENABLED是否覆盖启用0
SD_ID序列化配置信息86(对应SDS中SD_ID)
TBL_NAME表名ex_detail_ufdr_30streaming
TBL_TYPE表类型MANAGED_TABLE、EXTERNAL_TABLE、INDEX_TABLE、VIRTUAL_YABLE
 
VIEW_EXPANDED_TEXT视图的详细HQL语句select 字段1,字段2,字段3 from ex_detail_ufdr_30streaming;
VIEW_ORIGINAL_TEXT视图的原始HQL语句select * from ex_detail_ufdr_30streaming;

TABLE_PARAMS:数据表属性信息表

该表存储表/视图的属性信息

表结构入下:

字段名说明示例数据
TBL_ID表ID1
PARAM_KEY属性名totalSize、numRows、EXTERNAL
PARAM_VALUE属性值578436548、12458967、TRUE

TBL_PRIVS:授权表

该表存储表/视图的授权信息

在这里插入图片描述

4、Hive文件存储信息相关的元数据表

由于HDFS支持的文件格式很多,而建Hive表时候也可以指定各种文件格式,Hive在将HQL解析成MapReduce时候,需要知道去哪里,使用哪种格式去读写HDFS文件,而这些信息就保存在这几张表中。

SDS:该表保存文件存储的基本信息,如INPUT_FORMAT、OUTPUT_FORMAT、是否压缩等。

表结构如下:

字段名说明示例数据
SD_ID存储信息ID1
CD_ID字段信息ID21(对应CDS表)
INPUT_FORMAT文件输入格式

org.apache.hadoop.mapred.

TextInputFormat

IS_COMPRESSED是否压缩0
IS_STOREDASSUBDIRECTORIES是否以子目录存储0
LOCATIONHDFS路径

hdfs://192.168.1.101:9000/

detail_ufdr_streaming_test

NUM_BUCKETS分桶数量5
OUTPUT_FORMAT文件输出格式

org.apache.hadoop.hive.ql.io.

HiveIgnoreKeyTextOutputFormat

SERDE_ID序列化ID3(对应SERDES表)

SD_PARAMS: 该表存储Hive存储的属性信息,在创建表时候使用STORED BY ‘storage.handler.class.name’ [WITH SERDEPROPERTIES (…)指定。

表结构如下:

字段名说明示例数据
SD_ID存储配置ID1
PARAM_KEY属性名
PARAM_VALUE属性值

SERDES:该表存储序列化使用的类信息

表结构如下:

字段名说明示例数据
SERDE_ID序列化配置ID1
DESCRIPTION描述
DESERIALIZER_CLASS并行类
NAME名字
SERDE_TYPE序列化类型
SLIB系统库
SERIALIZER_CLASS序列化类

SERDE_PARAMS:该表存储序列化的一些属性、格式信息,比如:行、列分隔符

表结构如下:

字段名说明示例数据
SERDE_ID序列化配置ID1
PARAM_KEY属性名
PARAM_VALUE属性值

5、Hive表字段相关的元数据表

COLUMNS_V2:该表存储表对应的字段信息

表结构如下:

字段名说明示例数据
CD_ID字段信息ID212
COMMENT字段注释NULL
COLUMN_NAME字段名air_port_duration
TYPE_NAME字段类型名bigint
INTEGER_IDX字段顺序119

6、Hive表分分区相关的元数据表

主要涉及PARTITIONS、PARTITION_KEYS、PARTITION_KEY_VALS、PARTITION_PARAMS

PARTITIONS:该表存储表分区的基本信息

表结构如下:

  1. mysql> show create table PARTITIONS;
  2. +------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  3. | Table | Create Table |
  4. +------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  5. | PARTITIONS | CREATE TABLE `PARTITIONS` (
  6. `PART_ID` bigint(20) NOT NULL,
  7. `CREATE_TIME` int(11) NOT NULL,
  8. `LAST_ACCESS_TIME` int(11) NOT NULL,
  9. `PART_NAME` varchar(767) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  10. `SD_ID` bigint(20) DEFAULT NULL,
  11. `TBL_ID` bigint(20) DEFAULT NULL,
  12. PRIMARY KEY (`PART_ID`),
  13. UNIQUE KEY `UNIQUEPARTITION` (`PART_NAME`,`TBL_ID`),
  14. KEY `PARTITIONS_N50` (`SD_ID`),
  15. KEY `PARTITIONS_N49` (`TBL_ID`),
  16. CONSTRAINT `PARTITIONS_FK1` FOREIGN KEY (`SD_ID`) REFERENCES `SDS` (`SD_ID`),
  17. CONSTRAINT `PARTITIONS_FK2` FOREIGN KEY (`TBL_ID`) REFERENCES `TBLS` (`TBL_ID`)
  18. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
  19. +------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  20. 1 row in set (0.00 sec)

在这里插入图片描述

PARTITION_KEYS:该表存储分区的字段信息。

表结构如下:

  1. mysql> show create table PARTITION_KEYS;
  2. +----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  3. | Table | Create Table |
  4. +----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  5. | PARTITION_KEYS | CREATE TABLE `PARTITION_KEYS` (
  6. `TBL_ID` bigint(20) NOT NULL,
  7. `PKEY_COMMENT` varchar(4000) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  8. `PKEY_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
  9. `PKEY_TYPE` varchar(767) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
  10. `INTEGER_IDX` int(11) NOT NULL,
  11. PRIMARY KEY (`TBL_ID`,`PKEY_NAME`),
  12. KEY `PARTITION_KEYS_N49` (`TBL_ID`),
  13. CONSTRAINT `PARTITION_KEYS_FK1` FOREIGN KEY (`TBL_ID`) REFERENCES `TBLS` (`TBL_ID`)
  14. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
  15. +----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  16. 1 row in set (0.00 sec)

在这里插入图片描述

PARTITION_KEY_VALS:该表存储分区字段值

表结构如下:

  1. mysql> show create table PARTITION_KEY_VALS;
  2. +--------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  3. | Table | Create Table |
  4. +--------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  5. | PARTITION_KEY_VALS | CREATE TABLE `PARTITION_KEY_VALS` (
  6. `PART_ID` bigint(20) NOT NULL,
  7. `PART_KEY_VAL` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  8. `INTEGER_IDX` int(11) NOT NULL,
  9. PRIMARY KEY (`PART_ID`,`INTEGER_IDX`),
  10. KEY `PARTITION_KEY_VALS_N49` (`PART_ID`),
  11. CONSTRAINT `PARTITION_KEY_VALS_FK1` FOREIGN KEY (`PART_ID`) REFERENCES `PARTITIONS` (`PART_ID`)
  12. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
  13. +--------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  14. 1 row in set (0.00 sec)

在这里插入图片描述

 PARTITION_PARAMS:该表存储分区的属性信息

表结构如下:

  1. mysql> show create table PARTITION_PARAMS;
  2. +------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  3. | Table | Create Table |
  4. +------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  5. | PARTITION_PARAMS | CREATE TABLE `PARTITION_PARAMS` (
  6. `PART_ID` bigint(20) NOT NULL,
  7. `PARAM_KEY` varchar(256) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
  8. `PARAM_VALUE` varchar(4000) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  9. PRIMARY KEY (`PART_ID`,`PARAM_KEY`),
  10. KEY `PARTITION_PARAMS_N49` (`PART_ID`),
  11. CONSTRAINT `PARTITION_PARAMS_FK1` FOREIGN KEY (`PART_ID`) REFERENCES `PARTITIONS` (`PART_ID`)
  12. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
  13. +------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  14. 1 row in set (0.00 sec)

在这里插入图片描述

7、其他不常用的元数据表

  • DB_PRIVS
    • 数据库权限信息表。通过GRANT语句对数据库授权后,将会在这里存储。
  • IDXS
    • 索引表,存储Hive索引相关的元数据
  • INDEX_PARAMS
    • 索引相关的属性信息
  • TBL_COL_STATS
    • 表字段的统计信息。使用ANALYZE语句对表字段分析后记录在这里
  • TBL_COL_PRIVS
    • 表字段的授权信息
  • PART_PRIVS
    • 分区的授权信息
  • PART_COL_PRIVS
    • 分区字段的权限信息
  • PART_COL_STATS
    • 分区字段的统计信息
  • FUNCS
    • 用户注册的函数信息
  • FUNC_RU
    • 用户注册函数的资源信息

六、Hive库操作

创建数据库

create database test;     # 创建名字为test的数据库

create database if not exists test;   # 如果test数据库不存在就创建,存在就什么也不做

create database dbname location '路径';   #通过location指定数据库路径

create database dbname comment '描述信息';    #给数据库添加描述信息

查看数据库

show databases;   # 展示所有数据库

show databases like 'haha*';    # 模糊匹配like; 显示包含haha前缀的数据库名称

切换数据库

use test;       # 从当前数据库切换到test数据库

删除数据库

drop database test;    # 删除test数据库

drop database if exists test;    # 如果test数据库存在就删除否则什么也不做

drop database test cascade;      # 强制删除test数据库

查看数据库的详细描述

desc database test;   # 查看test数据库的详细信息

describe database test;  # 查看test数据库的详细信息

 七、Hive表操作

显示数据库中的表

show tables;   # 显示所有表

show tables like 'tab_*';   # 显示tab_开头的所有表

show tables 'tab_*';    # 显示tab_开头的所有表

desc tab_name;    # 显示表的详细信息
describe tab_name;  # 显示表的详细信息

创建表

建表语法:

  1. create [external] table [if not exists] table_name (
  2. col_name data_type [comment '字段描述信息']
  3. col_name data_type [comment '字段描述信息'])
  4. [comment '表的描述信息']
  5. [location '指定表的路径']
  6. [partitioned by (col_name data_type,...)]
  7. [clustered by (col_name,col_name,...)]
  8. [sorted by (col_name [asc|desc],...) into num_buckets buckets]
  9. [row format row_format]
  10. [location location_path]

其中中括号[  ]里面为可选参数;发现其最简单的建表语句是:

create table 表名(字段名  字段类型)

简单的表创建

create table tab_test(name string, age int);

指定字段分隔符

create table tab_test(name string,age int)
row format delimited fields terminated by ',';

创建外部表

create external table tab_test(name string,age int)
row format delimited fields terminated by ',';

外部表和普通表(内部表)的区别:

  • 外部表有external修饰,表数据保存在hdfs上,该位置由用户指定。删除表时,只会删除表的元数据,所以外部表不是由Hive完全管理的
  • 普通表没有external修饰,表数据保存在Hive默认的路径下,数据完全由Hive管理,删除表时元数据和表数据都会一起删除。

使用场合

  • 希望做数据备份并且不经常改变的数据,存放在外部表可以减少失误操作
  • 数据清洗转换后的中间结果,可以存放在内部表,因为Hive对内部表支持的功能比较全面,方便管理
  • 处理完成的数据由于需要共享,可以存储在外部表,这样能够防止失误操作,增加数据的安全性

创建分区表

create table tab_part(name string,age int)
partitioned by (sex string)
row format delimited fields terminated by ',';

  • 分区表指的是在创建表时指定的partition的分区空间。
  • partition就是辅助查询,缩小查询范围,加快数据的检索速度和对数据按照一定的规格和条件进行管理。

创建表,指定location

create table tab_location(name string,age int)
row format delimited fields terminated by ','
location 'hdfs://192.168.1.101:9000/user/hive/tables/';

创建带桶的表

create table student(id int,name string,age int)
partitioned by (sex string)
clustered by(id)
sorted by (age) into 2 buckets
row format delimited fields terminated by ',';

  • 分桶是相对分区进行更细粒度的划分。

  • 分桶将整个数据内容按照某列属性值取 hash 值进行区分,具有相同 hash 值的数据进入到同一个文件中。

 作用是

  • 取样 sampling 更高效。没有分区的话需要扫描整个数据集。
  • 提升某些查询操作效率,例如 map side join

修改表

添加分区

# 按照sex='male',sex='female'进行分区
alter table student add partition(sex='male') partition(sex='female');

删除分区

alter table student drop partition(sex='male');

重命名表

alter table table_name rename to new_table_name;

增加列

alter table student add columns (rank string);
或者
alter table student replace columns (height string);

删除表

drop table tab_name;

drop table if exists tab_name;

八、Hive查询结果四大排序

  • order by
    • order by是全局排序,会将所有的数据分发到一个reduce中去。
  • sort by
    • sort by 是对每个reduce中的数据进行排序,确保单个reduce中的数据都是有序的,这样后续对数据使用一次归并排序就可确保数据全局有序。
  • distribute by
    • distribute by 会将数据按照字段进行hash,确保相同内容的数据都分发到同一个reduce中,一般配合 sort by 字段使用。
  • cluster by
    • cluster by 相当于 distribute by 和 sort by 合用,不过 cluster by 只能使用升序排列。

九、Hive函数

Hive 中的函数,分三种:

  1. UDF (一进一出,普通函数)
  2. UDTF (多进一出,聚合函数)
  3. UDAF (一进多出,炸裂函数)

内置函数

关系运算符

操作符操作数描述
A = B所有原始类型如果表达式A等于表达式B,则为TRUE,否则为FALSE。
A != B所有原始类型如果表达式A不等于表达式B,则为TRUE,否则为FALSE。
A < B所有原始类型如果表达式A小于表达式B,则为TRUE,否则为FALSE。
A <= B所有原始类型如果表达式A小于或等于表达式B,则为TRUE,否则为FALSE。
A > B所有原始类型如果表达式A大于表达式B,则为TRUE,否则为FALSE。
A >= B所有原始类型如果表达式A大于或等于表达式B,则为TRUE,否则为FALSE。
A IS NULL所有类型如果表达式A的计算结果为NULL,则为TRUE,否则为FALSE。
A IS NOT NULL所有类型如果表达式A的计算结果为NULL,则为FALSE,否则为TRUE。
A LIKE BString如果字符串模式A与B匹配,则为TRUE,否则为FALSE。
A RLIKE BString如果A或B为NULL,则为NULL;如果A的任何子字符串与Java正则表达式B匹配,则为TRUE;否则为FALSE。
A REGEXP BString与RLIKE相同。

算术运算符

操作符操作数描述
A + B所有数字类型给出将A和B相加的结果。
A - B所有数字类型给出从A减去B的结果。
A * B所有数字类型给出A和B相乘的结果。
A / B所有数字类型给出将B除以A的结果。
A % B所有数字类型给出由A除以B产生的余数。
A & B所有数字类型给出A和B的按位与的结果。
A | B所有数字类型给出A和B的按位或的结果。
A ^ B所有数字类型给出A和B的按位XOR(异或)结果。
~A所有数字类型给出A的按位NOT的结果。

逻辑运算符

操作符操作数描述
A AND B布尔值如果A和B均为TRUE,则为TRUE,否则为FALSE。
A && B布尔值与A和B相同。
A OR B布尔值如果A或B或两者均为TRUE,则为TRUE,否则为FALSE。
A || B布尔值与A或B相同。
NOT A布尔值如果A为FALSE,则为TRUE,否则为FALSE。
!A布尔值与NOT A相同。

复数运算符

操作符操作数描述
A[n]A 是一个数组,n是一个整数它返回数组A中的第n个元素。第一个元素的索引为0。
M[key]M 是Map <K,V>并且键的类型为K它返回对应于映射中键的值。
S.xS 是一个结构它返回S的x字段。

Hive常用内置函数

查看系统自带的函数(内置函数)

show functions;

 默认内置了 289 个函数。通过命令desc function 函数名可以查看自带函数的描述;desc function extended 函数名可查看自带函数详细的用法。

  1. # 1.查看函数描述
  2. hive (test)> desc function upper;
  3. OK
  4. tab_name
  5. upper(str) - Returns str with all characters changed to uppercase
  6. Time taken: 0.014 seconds, Fetched: 1 row(s)
  7. # 2.查看函数详细用法
  8. hive (test)> desc function extended upper;
  9. OK
  10. tab_name
  11. upper(str) - Returns str with all characters changed to uppercase
  12. Synonyms: ucase
  13. Example:
  14. > SELECT upper('Facebook') FROM src LIMIT 1;
  15. 'FACEBOOK'
  16. Function class:org.apache.hadoop.hive.ql.udf.generic.GenericUDFUpper
  17. Function type:BUILTIN
  18. Time taken: 0.066 seconds, Fetched: 7 row(s)
  • date_add、date_sub函数(加减天数)

select date_add('2022-9-21',1);   # 第一个参数是具体日期,第二个参数是执行加操作的天数

  • date_format函数

select date_format('2022-9-21','yyyy-MM-dd HH:mm:ss');  # 日期格式化操作

  •  concat函数

select concat("hahahaha","…………","hehehehe");  

参考资料

Hive百度百科

Linux-安装MySQL(详细教程)  

Hive之深入了解元数据

Hive元数据信息表详解

Hive的数据库和表操作

Hive 内置运算符

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/396200
推荐阅读
相关标签
  

闽ICP备14008679号