Add one-skill

This commit is contained in:
Xin Wang
2026-05-13 11:03:00 +08:00
parent a4c8b29176
commit f9e36ef92d
34 changed files with 7656 additions and 0 deletions

View File

@@ -0,0 +1,211 @@
-- =====================================================================
-- @Name: HIVE-D-SQL-{表名}-CREATE
-- @Version: 1.0
-- @Desc: Hive 建表模板(内部表/外部表/分区/分桶)
-- @TargetDatabase: Hive
-- =====================================================================
-- ============================================================================
-- 场景1内部表Managed Table
-- ============================================================================
-- 适用Hive 管理数据和元数据DROP TABLE 时数据一并删除
CREATE TABLE IF NOT EXISTS db_name.managed_table (
id BIGINT COMMENT '主键ID',
name STRING COMMENT '名称',
category STRING COMMENT '类别',
amount DECIMAL(18,2) COMMENT '金额',
status STRING COMMENT '状态',
created_at TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP COMMENT '更新时间',
etl_time TIMESTAMP COMMENT '数据加工时间',
etl_remark STRING COMMENT '备注信息'
)
COMMENT '内部表示例'
STORED AS ORC; -- 推荐存储格式
-- ============================================================================
-- 场景2外部表External Table
-- ============================================================================
-- 适用数据由外部系统管理DROP TABLE 只删元数据不删数据
CREATE EXTERNAL TABLE IF NOT EXISTS db_name.external_table (
id BIGINT COMMENT '主键ID',
user_id STRING COMMENT '用户ID',
action STRING COMMENT '操作类型',
page_url STRING COMMENT '页面URL',
ip_address STRING COMMENT 'IP地址',
event_time TIMESTAMP COMMENT '事件时间'
)
COMMENT '日志外部表'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '/data/external/logs/';
-- ============================================================================
-- 场景3分区表单分区
-- ============================================================================
CREATE TABLE IF NOT EXISTS db_name.partitioned_table (
id BIGINT COMMENT '主键ID',
user_id STRING COMMENT '用户ID',
user_name STRING COMMENT '用户姓名',
order_count BIGINT COMMENT '订单数',
total_amount DECIMAL(18,2) COMMENT '总金额',
department STRING COMMENT '部门',
region STRING COMMENT '地区',
etl_time TIMESTAMP COMMENT '数据加工时间'
)
COMMENT '按日分区的统计表'
PARTITIONED BY (day_id STRING COMMENT '统计日期格式yyyy-MM-dd')
STORED AS ORC;
-- ============================================================================
-- 场景4多分区字段
-- ============================================================================
CREATE TABLE IF NOT EXISTS db_name.multi_partition_table (
id BIGINT COMMENT '主键ID',
name STRING COMMENT '名称',
amount DECIMAL(18,2) COMMENT '金额',
etl_time TIMESTAMP COMMENT '数据加工时间'
)
COMMENT '多分区字段示例表'
PARTITIONED BY (
year_id STRING COMMENT '年份',
month_id STRING COMMENT '月份'
)
STORED AS ORC;
-- ============================================================================
-- 场景5分桶表
-- ============================================================================
CREATE TABLE IF NOT EXISTS db_name.bucketed_table (
id BIGINT COMMENT '主键ID',
user_id BIGINT COMMENT '用户ID',
user_name STRING COMMENT '用户姓名',
amount DECIMAL(18,2) COMMENT '金额'
)
COMMENT '分桶表示例'
PARTITIONED BY (day_id STRING)
CLUSTERED BY (user_id) -- 分桶列
SORTED BY (amount DESC) -- 桶内排序
INTO 16 BUCKETS -- 桶数量
STORED AS ORC;
-- ============================================================================
-- 场景6ORC 格式 + 表属性
-- ============================================================================
CREATE TABLE IF NOT EXISTS db_name.orc_table (
id BIGINT COMMENT '主键ID',
name STRING COMMENT '名称',
amount DECIMAL(18,2) COMMENT '金额',
etl_time TIMESTAMP COMMENT '数据加工时间'
)
COMMENT 'ORC格式带属性配置'
PARTITIONED BY (day_id STRING)
STORED AS ORC
TBLPROPERTIES (
'orc.compress' = 'SNAPPY', -- 压缩格式
'orc.create.index' = 'true', -- 创建索引
'transactional' = 'false' -- 非事务表
);
-- ============================================================================
-- 场景7Parquet 格式
-- ============================================================================
CREATE TABLE IF NOT EXISTS db_name.parquet_table (
id BIGINT COMMENT '主键ID',
name STRING COMMENT '名称',
amount DECIMAL(18,2) COMMENT '金额',
tags ARRAY<STRING> COMMENT '标签数组',
props MAP<STRING,STRING> COMMENT '属性映射'
)
COMMENT 'Parquet格式表示例'
PARTITIONED BY (day_id STRING)
STORED AS PARQUET
TBLPROPERTIES (
'parquet.compression' = 'SNAPPY'
);
-- ============================================================================
-- 场景8临时表
-- ============================================================================
-- 会话级临时表(会话结束自动删除)
CREATE TEMPORARY TABLE tmp_processing (
id BIGINT,
name STRING,
amount DECIMAL(18,2)
);
-- CTAS 快速创建临时表
CREATE TEMPORARY TABLE tmp_source AS
SELECT id, name, amount
FROM source_table
WHERE day_id = '${day_id}';
-- ============================================================================
-- 字段类型速查
-- ============================================================================
/*
| 类型 | 说明 | 适用场景 |
|-------------------|----------------|------------------------|
| TINYINT | 1字节整数 | 小范围数值 |
| SMALLINT | 2字节整数 | 小范围数值 |
| INT | 4字节整数 | 数量、等级 |
| BIGINT | 8字节整数 | ID、计数 |
| FLOAT | 4字节浮点 | 近似计算 |
| DOUBLE | 8字节浮点 | 科学计算 |
| DECIMAL(p,s) | 定点数 | 金额、精确数值 |
| BOOLEAN | 布尔 | 状态标志 |
| STRING | 变长字符串 | 名称、描述(最常用) |
| VARCHAR(n) | 变长字符串 | 限定长度字符串 |
| CHAR(n) | 定长字符串 | 固定长度编码 |
| DATE | 日期 | 日期字段 |
| TIMESTAMP | 时间戳 | 时间字段 |
| BINARY | 二进制 | 二进制数据 |
| ARRAY<type> | 数组 | 多值字段 |
| MAP<k,v> | 映射 | 属性字典 |
| STRUCT<f1:t1,...> | 结构体 | 嵌套结构 |
*/
-- ============================================================================
-- 建表规范说明
-- ============================================================================
/*
1. 内部表 vs 外部表
- 内部表Hive 管理数据DROP 删数据和元数据
- 外部表外部管理数据DROP 只删元数据
- 生产推荐:原始数据用外部表,加工结果用内部表
2. 存储格式选择
- ORC推荐压缩好列存储支持谓词下推
- PARQUET跨平台兼容好列存储
- TEXTFILE原始数据导入性能最差
3. 分区设计
- 按时间分区最常用day_id, month_id
- 分区列不能出现在表定义的列中Hive 特有)
- 查询时分区列作为普通字段使用
4. 分桶设计
- 选择高基数列做分桶列
- 用于优化 JOIN分桶列相同可做 map-side join
- 用于数据抽样TABLESAMPLE
5. 字段命名规范
- snake_case 格式user_id, total_amount
- 主键id 或 {业务}_id
- 技术字段etl_time, etl_remark
- 分区字段day_id, month_id, year_id
6. COMMENT 必须添加
- 每个字段必须有 COMMENT
- 表必须有 COMMENT
*/