Hive高级建表技巧总结

目录

[1 分区表](#1 分区表)

[2 外部表](#2 外部表)

[3 ARRAY类型](#3 ARRAY类型)

[4 MAP类型](#4 MAP类型)

[5 STRUCT类型](#5 STRUCT类型)

[6 动态分区](#6 动态分区)

[7 表的生命周期管理](#7 表的生命周期管理)

7.1创建临时表

[7.2 设置表的生存时间(TTL)](#7.2 设置表的生存时间(TTL))

[8 存储格式优化](#8 存储格式优化)

[8.1 ORC格式](#8.1 ORC格式)

[8.2 Parquet格式](#8.2 Parquet格式)

[9 实战案例](#9 实战案例)

[如果觉得本文对你有帮助,想进一步学习SQL语言这门艺术的,那么不妨也可以选择去看看我的博客专栏 ,部分内容如下:](#如果觉得本文对你有帮助,想进一步学习SQL语言这门艺术的,那么不妨也可以选择去看看我的博客专栏 ,部分内容如下:)

数字化建设通关指南

[专栏 原价99,现在活动价59.9,按照阶梯式增长,直到恢复原价。](#专栏 原价99,现在活动价59.9,按照阶梯式增长,直到恢复原价。)


1 分区表

分区表可以提高查询效率

sql 复制代码
CREATE TABLE partition_table (
   id INT,
   name STRING
)
PARTITIONED BY (dt STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';

2 外部表

外部表适用于数据已存在于HDFS的情况:

sql 复制代码
CREATE EXTERNAL TABLE external_table (
   id INT,
   name STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LOCATION '/user/hive/warehouse/external_table';

3 ARRAY类型

sql 复制代码
CREATE TABLE employees (
    name STRING,
    skills ARRAY<STRING>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY ':';

4 MAP类型

sql 复制代码
CREATE TABLE user_attributes (
    user_id INT,
    attributes MAP<STRING, STRING>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY ':'
MAP KEYS TERMINATED BY '#';

5 STRUCT类型

sql 复制代码
CREATE TABLE complex_types (
    id INT,
    contact STRUCT<phone:STRING, email:STRING>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY ':';

6 动态分区

动态分区允许在插入数据时自动创建分区,非常适合处理大量分区的场景。

sql 复制代码
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;

CREATE TABLE sales (
    id INT,
    amount DOUBLE,
    date STRING
)
PARTITIONED BY (year INT, month INT);

INSERT OVERWRITE TABLE sales
PARTITION(year, month)
SELECT id, amount, date, 
       YEAR(date) as year, 
       MONTH(date) as month 
FROM raw_sales;

7 表的生命周期管理

7.1创建临时表

临时表只在当前会话中有效,会话结束后自动删除。

sql 复制代码
CREATE TEMPORARY TABLE temp_stats (
    metric STRING,
    value DOUBLE
);

7.2 设置表的生存时间(TTL)

sql 复制代码
CREATE TABLE expiring_logs (
    log_time TIMESTAMP,
    event STRING
)
TBLPROPERTIES ('transient_lastDdlTime'='1635724800');

ALTER TABLE expiring_logs 
SET TBLPROPERTIES ('lifetime'='30d');

8 存储格式优化

8.1 ORC格式

sql 复制代码
CREATE TABLE orc_table (
    id INT,
    name STRING
)
STORED AS ORC
TBLPROPERTIES ("orc.compress"="SNAPPY");

8.2 Parquet格式

sql 复制代码
CREATE TABLE parquet_table (
    id INT,
    name STRING
)
STORED AS PARQUET;

9 实战案例

假设我们需要设计一个高效的日志分析系统,可以这样构建表结构:

sql 复制代码
-- 创建原始日志表
CREATE EXTERNAL TABLE raw_logs (
    log_time TIMESTAMP,
    user_id STRING,
    ip STRING,
    action STRING,
    details STRING
)
PARTITIONED BY (date STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION '/data/raw_logs';

-- 创建优化后的分析表
CREATE TABLE analyzed_logs (
    log_hour TIMESTAMP,
    user_id STRING,
    action STRING,
    action_count INT
)
PARTITIONED BY (date STRING)
CLUSTERED BY (user_id) INTO 32 BUCKETS
STORED AS ORC
TBLPROPERTIES ("orc.compress"="SNAPPY");

-- 使用动态分区插入数据
INSERT OVERWRITE TABLE analyzed_logs
PARTITION (date)
SELECT 
    FLOOR(log_time TO HOUR) as log_hour,
    user_id,
    action,
    COUNT(*) as action_count,
    TO_DATE(log_time) as date
FROM raw_logs
GROUP BY 
    FLOOR(log_time TO HOUR),
    user_id,
    action,
    TO_DATE(log_time);

这个设计充分利用了分区、分桶和列式存储的优势,可以高效地支持各种分析查询。

如果觉得本文对你有帮助,想进一步学习SQL语言这门艺术的,那么不妨也可以选择去看看我的博客专栏 ,部分内容如下:
数字化建设通关指南
专栏 原价99,现在活动价59.9,按照阶梯式增长,直到恢复原价。

具体专栏链接如下:

​​​​​​数字化建设通关指南_莫叫石榴姐的博客-CSDN博客

相关推荐
Yz98765 小时前
Hive的基础函数-日期函数
大数据·数据仓库·hive·hadoop·sql·数据库架构·big data
Mephisto.java7 小时前
【大数据学习 | Spark-Core】详解Spark的Shuffle阶段
大数据·学习·spark
FreeIPCC7 小时前
电话机器人是什么?
大数据·人工智能·语言模型·机器人·开源·信息与通信
Tianyanxiao7 小时前
【探商宝】大数据获客平台在销售型企业中的应用
大数据·经验分享·科技·数据分析
财富探秘者7 小时前
贵州茅台[600519]行情数据接口
大数据·c语言·python·算法·金融·restful
字节数据平台7 小时前
火山引擎数据飞轮探索零售企业大促新场景:下放营销活动权限
大数据·人工智能
jlting1959 小时前
《Linux中软件的两种安装方式》详细步骤
大数据·mysql
EDG Zmjjkk10 小时前
Hive离线数仓结构分析
数据仓库·hive·hadoop
hummhumm10 小时前
第33章 - Go语言 云原生开发
java·开发语言·后端·python·sql·云原生·golang
King.62410 小时前
sql工具!好用!爱用!
大数据·数据库·人工智能·sql·学习