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博客

相关推荐
2021_fc14 小时前
Flink笔记
大数据·笔记·flink
Light6014 小时前
数据要素与数据知识产权交易中心建设专项方案——以领码 SPARK 融合平台为技术底座,构建可评估、可验证、可交易、可监管的数据要素工程体系
大数据·分布式·spark
zyxzyx4915 小时前
AI 实战:从零搭建轻量型文本分类系统
大数据·人工智能·分类
薛不痒15 小时前
MySQL中使用SQL语言
数据库·sql·mysql
五阿哥永琪15 小时前
SQL中的函数--开窗函数
大数据·数据库·sql
程序员小羊!15 小时前
数仓数据基线,在不借助平台下要怎么做?
大数据·数据仓库
码农阿豪15 小时前
告别兼容焦虑:电科金仓 KES 如何把 Oracle 的 PL/SQL 和 JSON 业务“接住”
数据库·sql·oracle·json·金仓数据库
曹牧15 小时前
Oracle SQL 中,& 字符
数据库·sql·oracle
火山引擎开发者社区17 小时前
两大模型发布!豆包大模型日均使用量突破 50 万亿 Tokens
大数据·人工智能
小小测试开发17 小时前
实战派SQL性能优化:从语法层面攻克项目中的性能瓶颈
android·sql·性能优化