【Apache Hive】

news2025/4/1 18:16:06

一、Hive简介

官网:https://hive.apache.org

1、Hive是什么?

  • Apache Hive 是一款建立在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,称为Hive查询语言(HQL),用于访问和分析存储在Hadoop文件中的大型数据集。
  • Hive 利用HDFS存储数据,利用MapReduce查询分析数据。
  • Hive 核心是将HQL转换为MapReduce程序,然后将程序提交到Hadoop集群执行。
  • Hive 的最大的魅力在于用户专注于编写HQL,Hive帮您转换成为MapReduce程序完成对数据的分析。
  • Hive 适用于离线批处理。
  • Hive 由Facebook实现并开源。

2、核心特性

  • 类 SQL 接口(HiveQL):降低 Hadoop 使用门槛,允许熟悉 SQL 的用户直接编写查询。
  • 多种执行引擎:默认使用 MapReduce,但支持更高效的 Tez 和 Spark 以提高性能。
  • 元数据管理:通过 Metastore(通常使用 MySQL、PostgreSQL 等关系数据库)存储表结构、分区等元数据。
  • 数据存储优化:
    • 分区:按目录划分数据(如按日期),加速查询。
    • 分桶:按哈希值分文件存储,提升采样和连接效率。
    • 存储格式:支持列式存储(ORC、Parquet),压缩率高,查询更快。
  • 表类型:
    • 内部表(Managed):数据由 Hive 管理,删除表时数据一并删除。
    • 外部表(External):数据存于 HDFS,删除表仅移除元数据。
    • 扩展性:支持用户自定义函数(UDF)、SerDe(序列化/反序列化)处理复杂数据格式。

3、架构组件

在这里插入图片描述

3.1 用户接口

客户端接口: CLI、JDBC/ODBC、WebGUI。其中,CLI(command line interface)为shell命令行;Hive中的Thrift服务器允许外部客户端通过网络与Hive进行交互,类似于JDBC或ODBC协议。WebGUI是通过浏览器访问Hive。

Hive提供了 Hive shell、ThriftServer等服务进程向用户提供操作接口

3.2 元数据存储

Metastore:集中管理元数据,支持多用户协作。

通常是存储在关系数据库如 mysql/derby中。Hive 中的元数据包括表的名字、表的列和分区及其属性、表的属性(是否为外部表等)、表的数据所在目录等。

3.3 Driver 驱动程序

包括语法解析器、计划编译器、优化器、执行器

完成 HQL 査询语句从词法分析、语法分析、编译、优化以及査询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有执行引擎调用执行。这部分内容不是具体的服务进程,而是封装在Hive所依赖的Jar文件即Java代码中

3.4 执行引擎

执行引擎:将逻辑计划转为物理任务(如 MapReduce DAG)。

Hive本身并不直接处理数据文件。而是通过执行引擎处理。当下Hive支持MapReduce、Tez、Spark3种执行引擎。

4、Hive Metadata

元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。

Hive Metadata 即 Hive 的元数据。包含用 Hive 创建的 database、table、表的位置、类型、属性,字段顺序类型等元信息。元数据存储在关系型数据库中。如 hive 内置的 Derby、或者第三方如 MySQL 等。

5、Hive Metastore

Metastore即元数据服务。Metastore服务的作用是管理metadata元数据,对外暴露服务地址,让各种客户端通过连接metastore服务,由metastore再去连接MySQL数据库来存取元数据。

有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。某种程度上也保证了hive元数据的安全。

Metastore 配置模式:

服务配置模式内嵌模式本地模式远程模式
Metastore单独配置、启动
Metadata存储介质DerbyMySQLMySQL

5.1 内嵌模式

内嵌模式(Embedded Metastore)是 metastore 默认部署模式。此种模式下,元数据存储在内置的 Derby 数据库,并且 Derby 数据库和 metastore 服务都嵌入在主 HiveServer 进程中,当启动 HiveServer 进程时,Derby 和 metastore 都会启动。不需要额外起 Metastore 服务。但是一次只能支持一个活动用户,适用于测试体验,不适用于生产环境。
在这里插入图片描述

5.2 本地模式

本地模式(Local Metastore)下,Metastore 服务与主 HiveServer 进程在同一进程中运行,但是存储元数据的数据库在单独的进程中运行,并且可以在单独的主机上。metastore 服务将通过 JDBC 与 metastore 数据库进行通信。

本地模式采用外部数据库来存储元数据,推荐使用 MySQL。hive 根据 hive.metastore.uris 参数值来判断,如果为空,则为本地模式。

缺点是:每启动一次 hive 服务,都内置启动了一个 metastore。

在这里插入图片描述

5.3 远程模式

远程模式(Remote Metastore)下,Metastore 服务在其自己的单独 JVM 上运行,而不在 HiveServer 的 JVM 中运行。如果其他进程希望与 Metastore 服务器通信,则可以使用 Thrift Network API 进行通信。

远程模式下,需要配置 hive.metastore.uris 参数来指定 metastore 服务运行的机器 ip 和端口,并且需要单独手动启动 metastore 服务。元数据也采用外部数据库来存储元数据,推荐使用 MySQL。

在生产环境中,建议用远程模式来配置 Hive Metastore。在这种情况下,其他依赖 hive 的软件都可以通过 Metastore 访问 hive。由于还可以完全屏蔽数据库层,因此这也带来了更好的可管理性/安全性。

在这里插入图片描述

二、部署Hive

1、环境准备

  • 安装Hadoop:
    • 【】
    • 修改Hadoop配置文件 core-site.xml
      <!-- 指定 hadoop用户可以代理所有主机的用户 -->
      <property>
          <name>hadoop.proxyuser.hadoop.hosts</name>
          <value>*</value>
      </property>
      <!-- 指定 hadoop用户可以代理所有用户组的用户 -->
      <property>
          <name>hadoop.proxyuser.hadoop.groups</name>
          <value>*</value>
      </property>
      
  • 安装MySQL
    • 【Linux】MySQL部署
    • 下载 com.mysql / mysql-connector-j
      • MySQL Connector/J (Archived Versions)
      • 阿里云Maven仓库

2、安装Hive

# 下载
wget https://dlcdn.apache.org/hive/hive-4.0.1/apache-hive-4.0.1-bin.tar.gz

# 解压
tar -zxvf apache-hive-4.0.1-bin.tar.gz -C /app

# 将mysql驱动挪进lib目录
mv mysql-connector-j-8.4.0.jar /app/apache-hive-4.0.1-bin/lib/

# 登陆mysql,创建hive数据库
mysql -uroot -p
mysql> create database hive charset utf8;
mysl> quit;

# 进入hive目录
cd /app/apache-hive-4.0.1-bin

# 修改配置文件
tee conf/hive-env.sh << 'EOF'
export HADOOP_HOME=/app/hadoop-3.4.0
export HIVE_CONF_DIR=/app/apache-hive-4.0.1-bin/conf
export HIVE_AUX_JARS_PATH=/app/apache-hive-4.0.1-bin/lib
EOF
tee conf/hive-site.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <!-- 指定 Hive 元数据存储的 JDBC 连接 URL。这里使用的是 MySQL 数据库 -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://rl-node1:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false&amp;allowPublicKeyRetrieval=true&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
    </property>
 	<!-- 指定 JDBC 连接的驱动类名。 低版本驱动类名:com.mysql.jdbc.Driver -->
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.cj.jdbc.Driver</value>
    </property>
    <!-- 指定连接数据库的用户名。 -->
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>test</value>
    </property>
    <!-- 指定连接数据库的密码 -->
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>+Test123</value>
    </property>
    <!-- 指定 HiveServer2 Thrift 服务的绑定主机名。这是 HiveServer2 服务监听的地址。 -->
    <property>
        <name>hive.server2.thrift.bind.host</name>
        <value>rl-node1</value>
    </property>
    <!-- 指定 Hive Metastore 服务的 URI。这是客户端连接到 Metastore 服务时使用的地址和端口。 -->
    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://rl-node1:9083</value>
    </property>
    <!-- 禁用元数据存储的事件通知 API 的授权。这通常用于测试环境或当你不希望使用安全认证时。  -->
    <property>
        <name>hive.metastore.event.db.notification.api.auth</name>
        <value>false</value>
    </property>
    <!-- 禁用元数据存储模式(schema)的验证。在升级 Hive 或更改元数据存储模式时,可能需要暂时禁用此验证。但在生产环境中,建议启用它以确保模式的一致性。 -->
    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
    </property>
</configuration>
EOF

# 移除SLF4J依赖,避免与Hadoop重复导入依赖致使依赖冲突
mv lib/log4j-slf4j-impl-2.18.0.jar lib/log4j-slf4j-impl-2.18.0.jar.bak

# hive数据库初始化
sh bin/schematool -initSchema -dbType mysql -verbos

# 创建日志目录
mkdir logs

# 启动hive元数据管理服务,注意要先启动hadoop、mysql
nohup bin/hive --service metastore >> logs/metastore.log 2>1 &

3、Hive 脚本

3.1 bin目录下的脚本文件

  • beeline:这是一个基于 JDBC 的 Hive 客户端,用于连接和执行 Hive 查询。它提供了比传统 Hive CLI 更丰富的功能和更好的性能。
  • hive:这是 Hive 的命令行接口(CLI)的启动脚本。它允许用户直接在命令行中运行 HiveQL 命令。然而,请注意,随着 Hive 的发展,Hive CLI 已经被认为是不推荐使用的,并且可能会在未来的版本中被移除。目前,推荐使用 Beeline 替代 Hive CLI。
  • hiveserver2:这是启动 HiveServer2 服务的脚本。HiveServer2 是一个基于 Thrift 的服务器,它允许远程客户端通过 JDBC 或 ODBC 连接到 Hive 并执行查询。HiveServer2 提供了比 HiveServer(Hive 1.x 中的版本)更好的性能和安全性。
  • init-hive-dfs.sh:这个脚本用于初始化 Hive 在 HDFS 上的目录结构。在首次使用 Hive 之前,您需要运行此脚本来创建必要的目录和文件。这些目录和文件用于存储 Hive 的元数据、临时文件等。
  • replstats.sh:这个脚本与 Hive 的复制(Replication)功能相关。它可能用于查看或管理复制过程中的统计信息。然而,具体的用途可能会根据 Hive 的版本和配置而有所不同。
  • hive-config.sh:这个脚本可能用于设置 Hive 的环境变量和配置。它可能被其他脚本(如 hive 或 hiveserver2)调用,以确保 Hive 在正确的环境中运行。然而,具体的用途和内容可能会根据 Hive 的版本和安装方式而有所不同。
  • hplsql:HPL/SQL 是一个用于 Hive 的 PL/SQL 兼容层,允许用户使用类似 PL/SQL 的语法来编写 HiveQL 查询。然而,这个脚本可能是一个链接到 HPL/SQL 工具的启动脚本,或者是 HPL/SQL 发行版中与 Hive 集成的一部分。请注意,HPL/SQL 可能不是 Apache Hive 官方项目的一部分,而是一个第三方工具。
  • metatool:这个脚本用于管理 Hive 的元数据。它可以用于执行与 Hive 元数据库相关的各种任务,如检查元数据库的完整性、升级元数据库架构等。
  • schematool:这个脚本用于管理 Hive 的数据库架构。它可以用于创建、升级或验证 Hive 的数据库架构,确保它与当前安装的 Hive 版本兼容。
  • ext:包含一些额外的工具或脚本,这些工具或脚本是 Hive 发行版的一部分,但不是核心功能所必需的。

3.2 HiveServer、HiveServer2 服务

HiveServer、HiveServer2 都是 Hive 自带的两种服务,允许客户端在不启动 CLI(命令行)的情况下对 Hive 中的数据进行操作,且两个都允许远程客户端使用多种编程语言如 java,python 等向 hive 提交请求,取回结果。

但是,HiveServer 不能处理多于一个客户端的并发请求。因此在 Hive-0.11.0 版本中重写了 HiveServer 代码得到了 HiveServer2,进而解决了该问题。HiveServer 已经被废弃。HiveServer2 支持多客户端的并发和身份认证,旨在为开放 API 客户端如 JDBC、ODBC 提供更好的支持。

HiveServer2 通过 Metastore 服务读写元数据。所以在远程模式下,启动 HiveServer2 之前必须先首先启动 metastore 服务。

远程模式下,Beeline 客户端只能通过 HiveServer2 服务访问 Hive。而 bin/hive 是通过 Metastore 服务访问的。具体关系如下:

在这里插入图片描述

启动hiverserver2服务(两种方式):

nohup bin/hiveserver2 >> logs/hiveserver2.log 2>1 &

nohup bin/hive --service hiveserver2 >> logs/hiveserver2.log 2>1 &

可能存在的问题:使用jps 或者ps 可以查到 hiveserver2 服务进程,但是用ss或者netstat查不到监听信息,排错步骤:

# 打开hive日志记录
sed 's|property\.hive\.log\.dir *= *.*|property.hive.log.dir = /app/apache-hive-4.0.1-bin/logs|' conf/hive-log4j2.properties.template > conf/hive-log4j2.properties

# 关闭hiverserver2重启
ps -ef | grep hiveserver2 | grep -v grep | awk '{print $2}' | xargs kill -9
nohup bin/hiveserver2 >> logs/hiveserver2.log 2>1 &

# 查看日志
less logs/hive.log

报错信息如下:

Caused by: org.apache.hadoop.ipc.RemoteException: Permission denied: user=appuser, access=WRITE, inode="/":hadoop:supergroup:drwxr-xr-x

这个错误信息表明在尝试写入 HDFS(Hadoop Distributed File System)的根目录 / 时,用户 appuser 没有足够的权限。

为了解决这个问题,您可以考虑以下几个选项:

  • 更改 HDFS 目录的权限
    • 通常不推荐更改 HDFS 根目录的权限,因为这可能会影响整个集群的安全性。但是,如果您确实需要 appuser 在特定目录下写入文件,可以考虑为该目录设置更宽松的权限(请注意,这可能会带来安全风险)。
      # 创建仓库目录
      hadoop fs -mkdir -p /user/hive/warehouse
      
      # 设置目录权限(允许 appuser 读写)
      hadoop fs -chmod -R 777 /user/hive/warehouse   # 简化测试权限
      hadoop fs -chown -R appuser:supergroup /user/hive/warehouse  # 设置所有者和组
      
      # 验证目录权限
      hadoop fs -ls /user/hive
      
  • 使用具有适当权限的用户运行 HiveServer2
    • 如果可能,使用 hadoop 用户或属于 supergroup 组的用户来启动 HiveServer2。这通常不是最佳实践,因为它可能绕过正常的权限检查。更好的做法是为 HiveServer2 配置一个具有所需最小权限的专用服务账户。
      chown -R hadoop:hadoop /app/apache-hive-4.0.1
      su - hadoop
      
  • 更改 HiveServer2 的配置以使用不同的 HDFS 目录
    • 修改 HiveServer2 的配置,使其使用非根目录的 HDFS 目录作为工作目录或日志目录。这是推荐的做法,因为它既保持了安全性,又避免了权限问题。
    • 修改 hive-site.xml
      <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/custom/hive/warehouse</value>  <!-- 自定义路径 -->
      </property>
      
      并确保该路径在 HDFS 中存在且权限正确。
  • 使用 HDFS 的 ACL(访问控制列表)
    • 如果您的 Hadoop 版本支持 ACL,可以为特定用户或组设置更细粒度的权限。
  • 检查 Hadoop 的用户模拟配置
    • HiveServer2 通常配置为模拟提交查询的用户。确保 Hadoop 的用户模拟配置正确无误,并且 appuser 有权在所需的 HDFS 路径上执行操作。

3.3 bin/hive、bin/beeline

Hive 发展至今,总共历经了两代客户端工具。

  • 第一代客户端(deprecated 不推荐使用):$HIVE_HOME/bin/hive,是一个 shell Util。主要功能:
    • 用于以交互或批处理模式运行 Hive 查询;
    • 用于 Hive 相关服务的启动,比如 metastore 服务。
  • 第二代客户端(recommended 推荐使用):$HIVE_HOME/bin/beeline,是一个 JDBC 客户端,是官方强烈推荐使用的 Hive 命令行工具,和第一代客户端相比,性能加强安全性提高。

Beeline 在嵌入式模式和远程模式下均可工作。在嵌入式模式下,它运行嵌入式 Hive(类似于Hive Client);而远程模式下 beeline 通过 Thrift 连接到单独的 HiveServer2 服务上,这也是官方推荐在生产环境中使用的模式。

3.4 bin/hive 客户端使用

在 hive 安装包的 bin 目录下,有 hive 提供的第一代客户端 bin/hive。该客户端可以访问 hive的 metastore 服务,从而达到操作 hive 的目的。

如果您是远程模式部署,请手动启动运行 metastore 服务。如果是内嵌模式和本地模式,直接运行 bin/hive,metastore 服务会内嵌一起启动。可以直接在启动 Hive metastore 服务的机器上使用 bin/hive 客户端操作,此时不需要进行任何配置。

# 去掉hive脚本中切换BEELINE命令
sed -i "s|USE_BEELINE_FOR_HIVE_CLI="true"||" bin/hive

# 登陆客户端
bin/hive

# hive 有一个默认数据库default
hive> show databases;
hive> desc database default;

# 注意此时查看hadoop-hdfs,会发现default数据库对应的目录/user/hive/warehouse不存在
hadoop fs -ls /

# 创建数据库
hive> create database my_hive;

# 当你新建一个数据库后,hdfs上才会对应创建出目录
hadoop fs -ls /

如果需要在其他机器上通过 bin/hive 访问 hive metastore 服务,只需要把当前机器上的 hive 安装目录 scp 发送到其他机器上,并在该机器的 hive-site.xml 配置中添加 metastore 服务地址即可。

[root@rl-node1 ~]# scp -r /app/apache-hive-4.0.1-bin rl-node2:$PWD
[root@rl-node1 ~]# nohup /app/apache-hive-4.0.1/bin/hive --service metastore &
[root@rl-node1 ~]# ssh rl-node2
[root@hadoop02 ~]# /app/apache-hive-4.0.1/bin/hive

3.5 bin/beeline 客户端使用

hive 经过发展,推出了第二代客户端 beeline,但是 beeline 客户端不是直接访问 metastore 服务的,而是需要单独启动 hiveserver2 服务。在 hive 安装的服务器上,首先启动 metastore 服务,然后启动 hiveserver2 服务。

# 先启动 metastore 服务
[hadoop@rl-node1 apache-hive-4.0.1-bin]$ nohup bin/hive --service metastore >> logs/metastore.log 2>1 &

# 启动hiveserver2,HiveServer2 的默认配置(包括端口 10000)是直接内置于 Hive 的核心代码中的,可通过配置 hive.server2.thrift.port 修改
[hadoop@rl-node1 apache-hive-4.0.1-bin]$ nohup bin/hive --service hiveserver2 >> logs/hiveserver2.log 2>1 &

# 登陆客户端
[hadoop@rl-node1 apache-hive-4.0.1-bin]$ bin/beeline 
beeline> !connect jdbc:hive2://rl-node1:10000
Connecting to jdbc:hive2://rl-node1:10000
Enter username for jdbc:hive2://hadoop01:10000: hadoop
Enter password for jdbc:hive2://hadoop01:10000: (这里直接回车)

# 查询数据库
0: jdbc:hive2://rl-node1:10000> show databases;

登陆客户端时报错:

25/03/02 11:48:39 [main]: WARN jdbc.HiveConnection: Failed to connect to rl-node1:10000
Error: Could not open client transport with JDBC Uri: jdbc:hive2://rl-node1:10000: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: hadoop is not allowed to impersonate hadoop (state=08S01,code=0)

注意前边在 hadoop 的 core-site.xml 里边配置完hadoop.proxyuser.hadoop.hosts、group 是不是没有重启HDFS。

三、Hive SQL语言

1、Hive 数据库操作

在Hive中,默认的数据库叫做default,存储数据位置位于HDFS的/user/hive/warehouse下。

用户自己创建的数据库存储位置是/user/hive/warehouse/database_name.db下。

  • 创建数据库
    create database if not exists study_test
        comment "这是一个学习的测试数据库"
        with dbproperties ('createBy' = 'root');
    
    • COMMENT:数据库的注释说明语句
    • LOCATION:指定数据库在HDFS存储位置,默认 /user/hive/warehouse/dbname.db
    • WITH DBPROPERTIES:用于指定一些数据库的属性配置
  • 删除数据库
    drop database study_test;
    
    • 默认行为是RESTRICT,这意味着仅在数据库为空时才删除它。
    • 要删除带有表的数据库(不为空的数据库),我们可以使用CASCADE。
  • 切换数据库
    use study_test;
    
    切换当前会话使用 study_test 数据库进行操作。
  • 查询当前数据库
    select current_database();
    
  • 数据库修改Location
    alter database my_hive set location hdfs_path;
    

2、Hive 创建表

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [database_name.]table_name 
(
  column_name data_type [COMMENT 'column_comment'],
  ...
)
[COMMENT 'table_comment']
[PARTITIONED BY (partition_column data_type, ...)]
[CLUSTERED BY (column_name, ...) [SORTED BY (column_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION 'hdfs_path']
[TBLPROPERTIES (property_name=property_value, ...)];

2.1 关键参数详解

  • EXTERNAL
    • 内部表(默认):数据由 Hive 管理,删除表时会同时删除元数据和 HDFS 数据。
    • 外部表(EXTERNAL):仅管理元数据,删除表时不删除 HDFS 数据。
      CREATE EXTERNAL TABLE external_table (id INT) row format delimited fields terminated by '\t' location '\tmp\test';
      
    • 内部表与外部表转换
      alter table t1 set tblproperties('EXTERNAL'=true);
      alter table t1 set tblproperties('EXTERNAL'=false);
      
  • PARTITIONED BY
    • 分区表:根据指定列(如日期、地区)将数据分目录存储,提高查询效率。
      CREATE TABLE logs (
        log_time STRING,
        message STRING
      )
      PARTITIONED BY (dt STRING);
      
  • CLUSTERED BY 和 SORTED BY
    • 分桶表:将数据按哈希分桶存储,优化 JOIN 和采样。
      CREATE TABLE user_bucketed (
        user_id INT,
        name STRING
      )
      CLUSTERED BY (user_id) INTO 4 BUCKETS;
      
  • ROW FORMAT
    • 定义数据行的格式:
      • DELIMITED:文本文件分隔符(如 CSV)。
      • SERDE:自定义序列化类(如处理 JSON)。
    CREATE TABLE csv_table (
      id INT,
      name STRING
    )
    ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY ',';
    
  • STORED AS
    • 指定存储格式:
      • TEXTFILE(默认): 文本文件。
      • PARQUET: 列式存储,适合分析。
      • ORC: 高效压缩列式存储。
      • AVRO: 支持 Schema 演化。
    CREATE TABLE orc_table (
      id INT,
      name STRING
    )
    STORED AS ORC;
    
  • LOCATION
    • 指定表数据在 HDFS 上的存储路径(默认使用 hive.metastore.warehouse.dir 配置)。
    CREATE TABLE custom_location_table (id INT)
    LOCATION '/user/hive/custom_path';
    
  • TBLPROPERTIES
    • 添加表级元数据属性:
    CREATE TABLE props_table (id INT)
    TBLPROPERTIES ('creator'='hadoop', 'project'='demo');
    

2.2 完整示例

  • 创建分区外部表(存储为 Parquet)
    CREATE EXTERNAL TABLE sales (
      product_id STRING,
      amount DOUBLE
    )
    PARTITIONED BY (sale_date STRING)
    STORED AS PARQUET
    LOCATION '/user/hive/sales_data'
    TBLPROPERTIES ('parquet.compression'='SNAPPY');
    
  • 创建分桶表(带排序)
    CREATE TABLE user_activity (
      user_id INT,
      action STRING,
      timestamp BIGINT
    )
    CLUSTERED BY (user_id) SORTED BY (timestamp DESC) INTO 8 BUCKETS
    STORED AS ORC;
    
  • 从查询结果创建表(CTAS)
    CREATE TABLE new_table AS 
    SELECT * FROM existing_table WHERE condition;
    
  • 复制表结构
    CREATE TABLE cloned_table LIKE existing_table;
    

2.3 验证表创建

  • 查看表结构:
    DESCRIBE FORMATTED table_name;
    
  • 检查 HDFS 路径:
    hadoop fs -ls /user/hive/warehouse/database_name.db/table_name
    

2.4 分桶、分库、分表、分区

维度分区分桶分库分表
层级物理划分(目录级)物理划分(文件级)逻辑隔离(数据库级)逻辑或物理划分(表级)
核心目的按列值剪裁数据均匀分布数据,优化 JOIN逻辑隔离表拆分大表
优化目标查询效率(分区剪枝)JOIN性能、数据采样数据管理和权限隔离单表数据量过大问题
实现方式按分区键分目录存储哈希分桶+排序创建不同数据库按规则拆分到多个表
自动管理支持动态分区需配置哈希规则完全手动完全手动
适用场景时间、地域等维度查询大表 JOIN、高效采样多业务线数据隔离历史数据归档、分片存储
数据冗余分区列值重复存储无冗余无冗余无冗余
查询优化分区剪裁减少扫描量Map-Side JOIN、高效采样无直接优化需手动联合查询

3、修改表

常用操作速查表

操作命令
重命名表ALTER TABLE old_name RENAME TO new_name
添加列ALTER TABLE table ADD COLUMNS (col_name data_type)
修改列名/类型ALTER TABLE table CHANGE COLUMN old_col new_col new_type
添加分区ALTER TABLE table ADD PARTITION (dt=‘2023-10-01’)
删除分区ALTER TABLE table DROP PARTITION (dt=‘2023-10-01’)
修改分区ALTER TABLE table PARTITION (dt=‘2023-10-01’) RENAME TO PARTITION (dt=‘2023-10-02’)
修改表存储格式ALTER TABLE table SET FILEFORMAT ORC
修改表注释ALTER TABLE table SET TBLPROPERTIES (‘comment’=‘new comment’)

3、数据导入(LOAD)

Hive 中 LOAD DATA 命令用于将数据文件从 本地文件系统(Local FS) 或 HDFS 加载到 Hive 表中。

3.1 基本语法

LOAD DATA [LOCAL] INPATH 'source_path' 
[OVERWRITE] INTO TABLE table_name 
[PARTITION (partition_column = value, ...)];

关键参数说明:

  • LOCAL
    • 指定数据源路径为 本地文件系统(如 /home/user/data.csv)。
    • 若省略 LOCAL,则路径指向 HDFS(如 /user/hive/input/data.csv)。
  • OVERWRITE
    • 覆盖目标表中的现有数据。
    • 若省略,则数据会追加到表中(不删除旧数据)。
  • PARTITION
    • 将数据加载到 分区表 的指定分区(需提前创建分区目录)。

3.2 使用场景与示例

  • 加载本地文件到 Hive 表
    -- 从本地加载(追加数据)
    LOAD DATA LOCAL INPATH '/home/hadoop/data/employee.csv' 
    INTO TABLE employee;
    
    -- 从本地加载(覆盖旧数据)
    LOAD DATA LOCAL INPATH '/home/hadoop/data/employee_new.csv' 
    OVERWRITE INTO TABLE employee;
    
  • 加载 HDFS 文件到 Hive 表
    -- 从 HDFS 加载(追加数据)
    LOAD DATA INPATH '/user/hive/input/employee.csv' 
    INTO TABLE employee;
    
    -- 从 HDFS 加载(覆盖旧数据)
    LOAD DATA INPATH '/user/hive/input/employee_new.csv' 
    OVERWRITE INTO TABLE employee;
    
  • 加载数据到分区表
    -- 加载到静态分区(需手动指定分区值)
    LOAD DATA LOCAL INPATH '/home/hadoop/data/sales_2023.csv' 
    INTO TABLE sales 
    PARTITION (year=2023, month='2023-01');
    

3.3 注意事项

  • 数据文件与表结构的匹配
    • 字段顺序与数量:数据文件的列必须与表定义的列 顺序和数量一致。
    • 数据格式:确保文件格式(如 CSV、TSV)与表的 ROW FORMAT 配置匹配(如分隔符为逗号或制表符)。
  • 文件路径规则
    • 本地文件系统:使用 LOCAL 时,路径需是 Hive 客户端所在机器的本地路径。
    • HDFS:不使用 LOCAL 时,路径必须是 HDFS 绝对路径(如 /user/hive/input/data.csv)。
  • 数据移动行为
    • HDFS 文件加载:数据文件会被 移动到 Hive 表的 HDFS 存储路径(如 /user/hive/warehouse/employee),原路径文件会消失。
    • 本地文件加载:文件会被 复制到 Hive 表的 HDFS 存储路径,本地原文件保留。
  • 外部表与内部表
    • 内部表(Managed Table):数据由 Hive 管理,删除表时数据会被删除。
    • 外部表(External Table):数据路径由用户指定,删除表时仅删除元数据,保留 HDFS 数据。

3.4 替代方案:直接操作 HDFS

如果数据已在 HDFS 中,可以直接将文件放入表的存储路径(需格式匹配):

hadoop fs -put /local/data.csv /user/hive/warehouse/employee

4、数据导入(INSERT)

在 Hive 中,使用 INSERT 语句可以将一个表中的数据导入到另一个表中,支持全量复制、条件筛选、数据转换等操作。

4.1 全量复制(覆盖目标表数据)

INSERT OVERWRITE TABLE target_table 
SELECT * FROM source_table;

4.2 全量复制(追加到目标表)

INSERT INTO TABLE target_table 
SELECT * FROM source_table;

4.3 选择性复制(带条件或列映射)

INSERT OVERWRITE TABLE target_table 
SELECT col1, col2 
FROM source_table 
WHERE condition;

4.4 动态分区插入(分区表专用)

INSERT OVERWRITE TABLE partitioned_table 
PARTITION (partition_col) 
SELECT col1, col2, partition_col 
FROM source_table;

5、数据导出(INSERT)

在 Hive 中,使用 SELECT 语句结合数据导出操作可以将查询结果保存到 本地文件系统 或 HDFS 中,支持多种格式和导出方式。

5.1 导出到 HDFS 目录

-- 覆盖导出(目录原有内容会被删除)
INSERT OVERWRITE DIRECTORY '/user/hive/output/result'
SELECT * FROM table_name WHERE condition;

-- 追加导出(保留原有内容,新增结果)
INSERT INTO DIRECTORY '/user/hive/output/result'
SELECT * FROM table_name WHERE condition;

5.2 导出到本地文件系统

-- 覆盖导出到本地(需添加 LOCAL 关键字)
INSERT OVERWRITE LOCAL DIRECTORY '/home/hadoop/result'
row format delimited fields terminated by '\t' 
SELECT * FROM table_name WHERE condition;

-- 追加导出到本地
INSERT INTO LOCAL DIRECTORY '/home/hadoop/result'
SELECT * FROM table_name WHERE condition;

6、数据导出(hive)

bin/hive -e "select * from my_hive.test;" > data/data1.txt

bin/hive -f export.sql > data/data2.txt

四、hive案例:将结构化文件映射到hive中

  • 结构化txt文件
    95001	李勇	男	20	CS
    95002	刘晨	女	19	IS
    95003	王敏	女	22	MA
    95004	张立	男	19	IS
    
  • hive中建表
    create table study_test.t_student
    (
        stu_no int 		comment '学号',
        name   string	comment '姓名',
        gender string	comment '性别',
        age    int		comment '年龄',
        remark string	comment '备注'
    ) row format delimited
        fields terminated by "\t";	//表示以制表符作为分割数据列的标志
    
  • 将文件上传到你新建表的目录下面
    hadoop fs -put t_student.txt /user/hive/warehouse/study_test.db/t_student
    
  • 查询数据
    SELECT * FROM study_test.t_student;
    

五、Apache Hive DML语句与函数使用

1、Hive SQL DML语法之加载数据

  • 在Hive中建表成功之后,就会在HDFS上创建一个与之对应的文件夹,且文件夹名字就是表名;
  • 文件夹父路径是由参数hive.metastore.warehouse.dir控制,默认值是/user/hive/warehouse;
  • Hive官方推荐使用Load命令将数据加载到表中

新建student_local.txt填充数据

95001,李勇,男,20,CS
95002,刘晨,女,19,IS
95003,王敏,女,22,MA
95004,张立,男,19,IS
95005,刘刚,男,18,MA
95006,孙庆,男,23,CS
95007,易思玲,女,19,MA
95008,李娜,女,18,CS
95009,梦圆圆,女,18,MA
95010,孔小涛,男,19,CS
95011,包小柏,男,18,MA
95012,孙花,女,20,CS
95013,冯伟,男,21,CS
95014,王小丽,女,19,CS
95015,王君,男,18,MA
95016,钱国,男,21,MA
95017,王风娟,女,18,IS
95018,王一,女,19,IS
95019,邢小丽,女,19,IS
95020,赵钱,男,21,IS
95021,周二,男,17,MA
95022,郑明,男,20,MA

新建表

--step1:建表
--建表student_local 用于演示从本地加载数据
create table student_local
(
    num  int,
    name string,
    sex  string,
    age  int,
    dept string
) row format delimited fields terminated by ',';

load数据

LOAD DATA LOCAL INPATH 'D:/hadoop/student_local.txt' INTO TABLE student_local;

2、Hive SQL-DML-Insert插入数据

最常用的配合是把查询返回的结果插入到另一张表中。

insert+select表示:将后面查询返回的结果作为内容插入到指定表中。

  • 需要保证查询结果列的数目和需要插入数据表格的列数目一致。
  • 如果查询出来的数据类型和插入表格对应的列数据类型不一致,将会进行转换,但是不能保证转换一定成功,转换失败的数据将会为NULL。
--创建一张目标表 只有两个字段
create table student_from_insert
(
    sno   int,
    sname string
);
--使用insert+select插入数据到新表中
insert into table student_from_insert select num, name from student_local;

select * from student_from_insert;

3、Hive SQL DML语法之查询数据

distinct去重

--返回所有匹配的行 去除重复的结果
select distinct state from t_usa_covid19;

其他的用法都和mysql很像,大致都是一样的方式。

4、Hive 常用函数入门

Hive的函数分为两大类:内置函数(Built-in Functions)、用户定义函数UDF(User-Defined Functions):

  • 内置函数可分为:数值类型函数、日期类型函数、字符串类型函数、集合函数、条件函数等;
  • 用户定义函数根据输入输出的行数可分为3类:UDF、UDAF、UDTF。
    • 根据函数输入输出的行数:
      • UDF(User-Defined-Function)普通函数,一进一出
      • UDAF(User-Defined Aggregation Function)聚合函数,多进一出
      • UDTF(User-Defined Table-Generating Functions)表生成函数,一进多出

5、Hive 常用的内置函数

函数库:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

(1)String Functions 字符串函数

字符串长度函数:length
字符串反转函数:reverse
字符串连接函数:concat
带分隔符字符串连接函数:concat_ws
字符串截取函数:substr,substring
------------String Functions 字符串函数------------
select length("dsaf");
select reverse("olklf");
select concat("angela","baby");
--带分隔符字符串连接函数:concat_ws(separator, [string | array(string)]+)
select concat_ws('.', 'www', array('gsdffsd', 'cn'));
--字符串截取函数:substr(str, pos[, len]) 或者 substring(str, pos[, len])
select substr("angelababy",-2); --pos是从1开始的索引,如果为负数则倒着数
select substr("angelababy",2,2);
--分割字符串函数: split(str, regex)
select split('apache hive', ' ');

(2)Date Functions 日期函数

----------- Date Functions 日期函数 -----------------
--获取当前日期: current_date
select current_date();
--获取当前UNIX时间戳函数: unix_timestamp
select unix_timestamp();
--日期转UNIX时间戳函数: unix_timestamp
select unix_timestamp("2011-12-07 13:01:03");
--指定格式日期转UNIX时间戳函数: unix_timestamp
select unix_timestamp('20111207 13:01:03','yyyyMMdd HH:mm:ss');
--UNIX时间戳转日期函数: from_unixtime
select from_unixtime(1618238391);
select from_unixtime(0, 'yyyy-MM-dd HH:mm:ss');
--日期比较函数: datediff 日期格式要求'yyyy-MM-dd HH:mm:ss' or 'yyyy-MM-dd'
select datediff('2012-12-08','2012-05-09');
--日期增加函数: date_add
select date_add('2012-02-28',10);
--日期减少函数: date_sub
select date_sub('2012-01-1',10);

(3)Mathematical Functions 数学函数

----Mathematical Functions 数学函数-------------
--取整函数: round 返回double类型的整数值部分 (遵循四舍五入)
select round(3.1415926);
--指定精度取整函数: round(double a, int d) 返回指定精度d的double类型
select round(3.1415926,4);
--取随机数函数: rand 每次执行都不一样 返回一个0到1范围内的随机数
select rand();
--指定种子取随机数函数: rand(int seed) 得到一个稳定的随机数序列
select rand(3);

(4)Conditional Functions 条件函数

--if条件判断: if(boolean testCondition, T valueTrue, T valueFalseOrNull)
select if(1=2,100,200);
select if(sex ='男','M','W') from student limit 3;
--空值转换函数: nvl(T value, T default_value)
select nvl("allen","itcast");
select nvl(null,"itcast");
--条件转换函数: CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END
select case 100 when 50 then 'tom' when 100 then 'mary' else 'tim' end;
select case sex when '男' then 'male' else 'female' end from student limit 3;

六、Hive 应用场景

  • 数据仓库:整合多源数据,执行复杂 ETL 流程。
  • 批处理分析:日志分析、数据聚合、报表生成(如每日/周汇总)。
  • 机器学习数据预处理:清洗、转换大规模训练数据。
  • 交互式查询:结合 LLAP 或 Presto 实现近似实时响应。

七、Hive 优缺点

(1)优点

  • 易用性强,SQL 语法降低分布式计算门槛。
  • 扩展性好,支持 TB/PB 级数据。
  • 灵活的数据模型与存储格式。

(2)局限性

  • 延迟较高,不适合实时场景。
  • 传统版本不支持事务,新版本支持有限 ACID。

八、与其他工具对比

  • Hive vs. HBase:Hive 为批处理设计;HBase 是 NoSQL 数据库,适合实时读写。
  • Hive vs. Impala/Presto:后者为交互式查询优化,延迟更低,但 Hive 稳定性更高。
  • Hive vs. Spark SQL:Spark SQL 支持内存计算,迭代任务更快,但 Hive 生态集成更成熟。

九、演进与生态整合

  • Hive on Spark:利用 Spark 引擎提升性能。
  • Hive 3.0+:支持 ACID 事务(INSERT/UPDATE/DELETE),增强实时能力。
  • 与云平台集成:AWS EMR、Azure HDInsight 等均提供托管 Hive 服务。

十、总结

Apache Hive 是大数据生态中不可或缺的工具,尤其适合需要 SQL 兼容性和批处理能力的场景。尽管实时性不足,但其易用性、扩展性及与 Hadoop 生态的深度整合,使其在企业数据仓库和离线分析中持续发挥重要作用。

二十、资料

  • 黑马程序员大数据入门到实战教程,大数据开发必会的Hadoop、Hive,云平台实战项目全套一网打尽
  • Apache Hive安装部署详细图文教程
  • Apache Hive详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2323792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL Server安装进度卡在 57%:Windows Update 服务异常

问题现象&#xff1a; 安装 SQL Server 2022 时进度停滞在 57%&#xff0c;日志报错 Error code 0x80070422&#xff0c;提示 “Windows Update 服务未运行”。 快速诊断 检查服务状态&#xff1a; # 查看 Windows Update 服务状态 Get-Service -Name wuauserv | Select-Object…

YOLO历代发展 图像增强方式 架构

YOLO1 YOLOV5 数据增强 mosaic 仿射变换(Affine)、透视变换(Perspective) 网络搭建

DexGrasp Anything:具有物理-觉察的普遍机器人灵巧抓取

25年3月来自上海科技大学的论文“DexGrasp Anything: Towards Universal Robotic Dexterous Grasping with Physics Awareness”。 能够抓取任何物体的灵巧手&#xff0c;对于通用具身智能机器人的开发至关重要。然而&#xff0c;由于灵巧手的自由度高&#xff0c;物体种类繁多…

对称加密算法和非对称加密算法

在这个互联网普及的时代&#xff0c;在不同终端对敏感甚至机密数据进行传输是非常常见的场景&#xff0c;但是如何保证数据传输过程的安全性和高效性是一个值得深入探讨的问题。 为此&#xff0c;伟大的人类研究出了多种加密算法&#xff0c;我们可以大致将其分为两类&#xf…

【计算机网络】OSI七层模型完全指南:从比特流到应用交互的逐层拆解

OSI模型 导读一、概念二、模型层次结构2.1 物理层&#xff08;Physical Layer&#xff09;2.2 数据链路层&#xff08;Data Link Layer&#xff09;​2.3 ​网络层&#xff08;Network Layer&#xff09;​2.4 ​传输层&#xff08;Transport Layer&#xff09;​2.5 ​会话层&…

数据不互通、审批慢?如何实现多系统智能协同

在企业信息化建设的过程中&#xff0c;数据孤岛和复杂的审批流程常常成为实现高效协同的巨大障碍。对于许多组织来说&#xff0c;面对越来越复杂的业务需求&#xff0c;如何实现多系统智能协同不仅关乎效率&#xff0c;更直接影响企业的竞争力。 数据不互通和审批流程慢的痛点…

如何用 Postman 正确传递 Date 类型参数,避免服务器解析错误?

如何在 Postman 中传递 Date 类型参数。调试工具如何模拟发送用户端的当前时间呢&#xff1f; Postman 传递 Date 类型参数教程

JUC 03

今天是2025/03/28 20:46 day 14 总路线请移步主页Java大纲相关文章 今天进行JUC 6,7,8 个模块的归纳 首先是JUC的相关内容概括的思维导图 由于内容比较多且重要&#xff0c; 个人还整理了一份详细JUC的思维导图&#xff0c;需要的请评论。是 xmind文件 6. 锁机制 深入解析…

CentOS 7 部署RuoYi 项目

换源 备份现有的 YUM 源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 默认的 CentOS 官方镜像源替换为阿里云的镜像源&#xff0c;以提高下载速度和稳定性。 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.co…

【JavaScript】八、对象

文章目录 1、对象的声明2、对象的使用3、对象中的方法4、遍历对象5、内置对象Math 1、对象的声明 一种数据类型&#xff0c;使用typeof查看类型&#xff0c;结果是object可以详细的描述描述某个事物 声明语法&#xff1a; // 多用花括号形式声明 // 比如声明一个person对象 …

Processor System Reset IP 核 v5.0(vivado)

这个IP的作用&#xff0c;我的理解是&#xff0c;比普通按键复位更加高效灵活&#xff0c;可以配置多个复位输出&#xff0c;可以配置复位周期。 1、输入信号&#xff1a; 重要的信号有时钟clk信号&#xff0c;一般连接到系统时钟&#xff1b;输入复位信号&#xff0c;一般是外…

linux0.11内核源码修仙传第十一章——硬盘初始化

&#x1f680; 前言 本文是初始化最后一部分了&#xff0c;对硬盘的初始化&#xff0c;对应于书中的第20回。希望各位给个三连&#xff0c;拜托啦&#xff0c;这对我真的很重要&#xff01;&#xff01;&#xff01; 目录 &#x1f680; 前言&#x1f3c6;块设备管理&#x1f3…

包络解调在故障诊断中的应用-广义检波解调案例

前言 前面我们曾介绍过广义检波解调的原理&#xff0c;那么今天就将学过的知识点真正用在故障诊断上&#xff0c;由于工厂数据集不能轻易获取&#xff0c;因此通过实验室仿真数据集来介绍整个诊断流程。 数据集 加拿大渥太华是故障诊断领域蛮出名的一个数据集&#xff0c;其…

喜报|迪捷软件入选工信部“2024年信息技术应用创新解决方案”

为进一步深化行业信息技术应用创新&#xff0c;健全信息技术应用创新产业生态&#xff0c;加快新技术新产品应用推广&#xff0c;强化应用牵引和需求导向&#xff0c;加强区域联动和资源整合&#xff0c;工业和信息化部网络安全产业发展中心&#xff08;工业和信息化部信息中心…

2.Python 计算机二级题库:选择题答案解析

一 对 题目1 题目2 题目3 补充&#xff1a;在 Python 中&#xff0c;数字类型的复数类型是 complex。 题目4 题目5 题目6 题目7 题目8 题目9 题目10 题目11 题目12 题目13 题目14 题目15 题目16 题目17 题目18 题目19 题目20 题目21 题目22 题目23 题目24 题目25 题目26 题目27…

使用Selenium和lxml库搜房网爬取某地区房屋信息(python、pycharm爬虫)

一、地址&#xff1a; url "https://zb.newhouse.fang.com/house/s/b91" # 第一页的 URL 但是这个爬虫我不知道为啥总是翻不了页数&#xff0c;请帮忙修改一下~ 二、用到的知识点以及代码详解&#xff1a; 这段代码是一个使用Selenium和lxml库实现的网页爬虫&a…

大模型训练过程中KVCache与MLA

基础内容 在Transformer模型中&#xff0c;每个token有qkv三个属性&#xff0c;分别通过神经网络变换得到。1 根据Transformer中注意力公式&#xff0c;每个token的q需要和之前所有的k计算注意力&#xff0c;然后经过Softmax函数后乘以之前所有token的V&#xff0c;得到最终的…

材质及制作笔记

基本流程&#xff1a; 建中模——zb雕刻高模——maya拓扑低模——拆uv——sp烘焙贴图——sp绘制材质——渲染 1 材质贴图&#xff1a; diffuse/albedo/basecolor&#xff1a;漫反射 reflection/specular&#xff1a;反射 metalness&#xff1a;金属度 glossiness&#xf…

语音机器人与智能体结合

自从春节期间deepseek的发布&#xff0c;大家对语音机器人接入大模型格外的关注。最近又收到一个需求&#xff0c;是语音机器人与智能体的结合。 什么是智能体&#xff1f; 智能体&#xff08;Agent&#xff09;是指能够感知环境并采取行动以实现目标的实体。根据其复杂程度&am…

Axios企业级封装实战:从拦截器到安全策略!!!

&#x1f680; Axios企业级封装实战&#xff1a;从拦截器到安全策略 &#x1f527; 核心代码解析 // 创建Axios实例 const service axios.create({baseURL: api, // &#x1f310; 全局API前缀timeout: 0, // ⏳ 永不超时&#xff08;慎用&#xff01;&#xff09;withCrede…