小菜鸟

java菜鸟号正在起航

Hive 内部表 vs 外部表:建表之前,先想清楚”这数据归谁管”

Hive 建表的时候,有一个绕不开的选择:

  • 内部表(MANAGED_TABLE):Hive 管数据,删表删数据
  • 外部表(EXTERNAL_TABLE):用户管数据,删表不删数据

怎么选?先回答一个问题:这份数据,Hive 是”独家拥有”还是”借来用用”?

数据来源 选什么
Flume 采集的日志、其他系统产生的原始数据 外部表(数据是别人的,Hive 只是借来查)
Hive ETL 生成的中间表、临时表、结果表 内部表(数据是 Hive 自己产生的,删了没关系)

内部表:Hive 管数据,删表就删数据

内部表是 Hive 的默认表类型。建表时不加 EXTERNAL,就是内部表。

建表语法:

CREATE TABLE user_info (
  id INT,
  name STRING,
  age INT
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

数据存哪? 默认在 /user/hive/warehouse/ 下,按库名和表名组织:

/user/hive/warehouse/study_hive.db/user_info/

删表时发生什么?

DROP TABLE user_info;
  • 元数据(表结构)被删
  • HDFS 上的数据文件也被删

什么时候用内部表?

  • ETL 过程中的中间表(算完就扔)
  • 临时表(测试用,用完就删)
  • Hive 自己产生的数据(不跟其他系统共享)

外部表:用户管数据,删表不删数据

外部表的数据存在 Hive 以外的地方,Hive 只是”借来查一下”。

建表语法(多了 EXTERNALLOCATION):

CREATE EXTERNAL TABLE log_data (
  ip STRING,
  access_time STRING,
  url STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
LOCATION '/data/nginx/logs/2026-07-20';

数据存哪? 建表时通过 LOCATION 指定,数据已经在那个路径下了。

删表时发生什么?

DROP TABLE log_data;
阅读全文 »

Hive DML 操作:建库、建表、改表、删表,一套 SQL 全搞定

Hive 的 DML 操作跟 MySQL 很像,但有几个关键区别:

  • 建表时要指定分隔符(不像 MySQL 已经定义好了)
  • 有内表和外表之分(删表时删不删数据,取决于类型)
  • 支持分区和分桶(大数据场景下的优化手段)

数据库操作:建库、切库、删库

数据库是表的容器,用来隔离不同业务的数据。

查看已有数据库:

show databases;

创建数据库:

CREATE DATABASE IF NOT EXISTS study_hive
COMMENT '学习 Hive 用的库'
LOCATION '/user/hive/warehouse/study_hive.db';
  • IF NOT EXISTS:库存在就不重复创建,不报错
  • LOCATION:指定库在 HDFS 上的存放位置(不指定的话默认在 /user/hive/warehouse/ 下)

切换数据库:

USE study_hive;

之后命令行提示符会变成 hive (study_hive)>,表示当前在这个库里操作。

查看数据库详情:

DESC DATABASE study_hive;
-- 输出:库名、注释、HDFS 路径、所有者

删除数据库:

-- 删空库(库里没有表)
DROP DATABASE IF EXISTS study_hive_empty;

-- 删非空库(库里还有表,强制删除)
DROP DATABASE study_hive CASCADE;

CASCADE 会连库带表一起删,操作不可逆,慎用。

创建表:核心是”列定义 + 分隔符 + 存储格式”

建表是 Hive 最常用的操作。语法跟 MySQL 类似,但多了分隔符和存储格式的配置。

基本模板:

阅读全文 »

Hive 配置:先配必选项,再调性能项,最后按场景优化

Hive 的配置项很多,但不用全记住。按优先级分三层:

层级 配置内容 不配会怎样
必配项 元数据存储(MySQL)、Metastore 地址 跑不起来
常用调优项 执行引擎、显示设置、动态分区 能用但体验差/效率低
场景化配置 Join 优化、并行度、内存 特定场景下性能瓶颈

这篇文章按”从必配到选配”的顺序讲,核心原则:先让 Hive 能跑,再调性能,最后按业务场景优化。

配置查看方式

改配置之前,先知道怎么看当前配置。

-- 看所有配置
hive> set;

-- 看某个配置
hive> set hive.execution.engine;
-- 输出:hive.execution.engine=mr

配置优先级:谁覆盖谁?

同一个配置可以在多个地方设置,优先级从高到低:

交互式 set 命令 > 命令行 -hiveconf > hive-site.xml > hive-default.xml
阅读全文 »

Hive 访问方式:本地命令行 → 远程 JDBC,从 hive 到 beeline 到 DataGrip

Hive 默认的 hive 命令是本地客户端——只能在那台装了 Hive 的机器上用。

如果你要:

  • 在另一台机器上连 Hive
  • 用 DataGrip、DBeaver 连 Hive
  • 用 Python/Java 代码操作 Hive

那就必须起两个服务:

服务 端口 管什么
Metastore 9083 元数据服务(表结构、分区信息)
HiveServer2 10000 JDBC 服务(接收远程连接、执行 SQL)

Metastore 是”数据库的数据库”——存表结构;HiveServer2 是”服务入口”——收 SQL 请求,翻译成任务去跑。

方式1:本地命令行 hive(最简单,只能本地)

直接敲 hive 就能进交互界面:

bin/hive

hive> show databases;
hive> create table test(id int);
hive> exit;

特点:

  • 只能在那台装了 Hive 的机器上用
  • 不需要额外起服务(默认连本地 Derby 或配置好的 MySQL)
  • 适合快速测试、验证 SQL

局限: 换个机器就连不上。

方式2:起 Metastore 服务——让元数据共享

默认情况下,每个 hive 客户端直接连元数据库(MySQL/Derby)。多个客户端同时连可能出问题(Derby 更明显)。

起 Metastore 服务后,所有客户端都通过这个服务访问元数据,统一管理。

配置(hive-site.xml):

<property>
  <name>hive.metastore.uris</name>
  <value>thrift://localhost:9083</value>
</property>

启动 Metastore:

# 前台跑(调试用)
bin/hive --service metastore

# 后台跑(生产用)
nohup bin/hive --service metastore > metastore.log 2>&1 &

验证:

netstat -tlnp | grep 9083   # 端口在监听
阅读全文 »

Hibernate 注解方式深度解析

Hibernate 注解方式是替代传统 XML 映射配置的主流方案,其核心优势在于配置与实体类代码耦合度低、开发效率高、可读性强。相较于 XML 配置需要维护独立的 .hbm.xml 文件,注解可直接嵌入实体类的属性或 getter 方法上,大幅简化了配置流程。本文将从核心注解分类、关联关系映射、高级配置(如复合主键、枚举映射)等维度,系统讲解 Hibernate 注解的使用方法,并补充关键注意事项。

核心基础注解:实体与主键配置

基础注解主要解决「实体类与数据库表的映射」和「主键生成策略」两大核心问题,是所有注解配置的基础。

实体类级注解

用于标识类为 Hibernate 实体,并指定对应的数据库表信息。

注解 作用说明 常用属性
@Entity 标识当前类是持久化实体,必须添加(否则 Hibernate 无法识别为映射类)。 name:指定实体对应的数据库表名(默认值为实体类名,如类名 Log 对应表 log)。
@Table 补充表级配置(可选,与 @Entity 配合使用)。 - name:同 @Entityname,优先级更高; - catalog:指定数据库 catalog; - schema:指定数据库 schema; - uniqueConstraints:定义表的唯一约束(如 @UniqueConstraint(columnNames = "requestUri"))。

主键相关注解

主键是实体映射的核心,Hibernate 通过 @Id 标识主键字段,并通过 @GeneratedValue 指定主键生成策略,满足不同业务场景(如自增、UUID、序列等)。

(1)@Id
  • 作用:标识当前字段为数据库表的主键(必须添加,一个实体类只能有一个 @Id)。
  • 位置:可放在属性上或 getter 方法上(需保持全类一致,不能混合使用)。
(2)@GeneratedValue
  • 作用:指定主键的生成策略(可选,若不指定则需手动设置主键值)。
  • 核心属性strategy,取值为 GenerationType 枚举,共 4 种策略:
阅读全文 »
0%