176 lines
6.3 KiB
SQL
176 lines
6.3 KiB
SQL
-- =====================================================================
|
||
-- @SparkSqlName: PAIMONA-D-SQL-{表名}-CREATE
|
||
-- @Version: 1.0
|
||
-- @Desc: 建表模板(CREATE TABLE)
|
||
-- @TargetTables: {新表名}
|
||
-- @TargetDatabase: Paimon
|
||
-- =====================================================================
|
||
|
||
-- ============================================================================
|
||
-- 场景1:基础表创建(非分区)
|
||
-- ============================================================================
|
||
CREATE TABLE IF NOT EXISTS ${db_eda_env}.basic_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 PARQUET; -- 存储格式
|
||
|
||
-- ============================================================================
|
||
-- 场景2:分区表创建(单分区字段)
|
||
-- ============================================================================
|
||
CREATE TABLE IF NOT EXISTS ${db_eda_env}.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 PARQUET;
|
||
|
||
-- ============================================================================
|
||
-- 场景3:多分区字段表
|
||
-- ============================================================================
|
||
CREATE TABLE IF NOT EXISTS ${db_eda_env}.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 PARQUET;
|
||
|
||
-- ============================================================================
|
||
-- 场景4:带表属性配置
|
||
-- ============================================================================
|
||
CREATE TABLE IF NOT EXISTS ${db_eda_env}.configured_table (
|
||
id BIGINT COMMENT '主键ID',
|
||
name STRING COMMENT '名称',
|
||
amount DECIMAL(18,2) COMMENT '金额',
|
||
etl_time TIMESTAMP COMMENT '数据加工时间'
|
||
)
|
||
COMMENT '带属性配置的表'
|
||
PARTITIONED BY (day_id STRING)
|
||
STORED AS PARQUET
|
||
TBLPROPERTIES (
|
||
'parquet.compression' = 'SNAPPY', -- 压缩格式
|
||
'spark.sql.partitionOverwriteMode' = 'dynamic' -- 动态分区覆盖模式
|
||
);
|
||
|
||
-- ============================================================================
|
||
-- 场景5:Paimon 表创建(主键表)
|
||
-- ============================================================================
|
||
CREATE TABLE IF NOT EXISTS ${db_eda_env}.paimon_pk_table (
|
||
-- 主键字段(Paimon 主键表必须包含所有主键字段)
|
||
id BIGINT COMMENT '主键ID',
|
||
day_id STRING COMMENT '分区日期',
|
||
|
||
-- 业务字段
|
||
name STRING COMMENT '名称',
|
||
amount DECIMAL(18,2) COMMENT '金额',
|
||
status STRING COMMENT '状态',
|
||
|
||
-- 技术字段
|
||
etl_time TIMESTAMP COMMENT '数据加工时间'
|
||
)
|
||
COMMENT 'Paimon 主键表(支持 MERGE INTO)'
|
||
PARTITIONED BY (day_id)
|
||
TBLPROPERTIES (
|
||
'primary-key' = 'id,day_id', -- 主键定义
|
||
'bucket' = '4', -- 分桶数
|
||
'changelog-producer' = 'input' -- 变更日志生产
|
||
);
|
||
|
||
-- ============================================================================
|
||
-- 场景6:临时表创建
|
||
-- ============================================================================
|
||
CREATE TEMPORARY TABLE tmp_processing_table (
|
||
id BIGINT,
|
||
name STRING,
|
||
amount DECIMAL(18,2)
|
||
);
|
||
|
||
-- 或使用 AS 创建临时表
|
||
CREATE TEMPORARY TABLE tmp_source AS
|
||
SELECT id, name, amount
|
||
FROM source_table
|
||
WHERE day_id = '${day_id}';
|
||
|
||
-- ============================================================================
|
||
-- 字段类型速查
|
||
-- ============================================================================
|
||
/*
|
||
| 类型 | 说明 | 适用场景 |
|
||
|---------------|----------------|------------------------|
|
||
| STRING | 字符串 | 名称、编码、描述 |
|
||
| INT | 整数 | 数量、等级、标志 |
|
||
| BIGINT | 大整数 | ID、计数、金额(整数) |
|
||
| DECIMAL(p,s) | 定点数 | 金额、比例、精度数值 |
|
||
| DOUBLE | 浮点数 | 科学计算(慎用于金额) |
|
||
| BOOLEAN | 布尔 | 状态标志 |
|
||
| DATE | 日期 | 日期字段 |
|
||
| TIMESTAMP | 时间戳 | 时间字段 |
|
||
| ARRAY<type> | 数组 | 多值字段 |
|
||
| MAP<k,v> | 映射 | 属性字典 |
|
||
*/
|
||
|
||
-- ============================================================================
|
||
-- 建表规范说明
|
||
-- ============================================================================
|
||
/*
|
||
1. 字段命名规范
|
||
- 使用 snake_case:user_id, total_amount
|
||
- 主键:id 或 {业务}_id
|
||
- 技术字段:etl_time, etl_remark
|
||
|
||
2. COMMENT 必须添加
|
||
- 每个字段必须有 COMMENT
|
||
- 表必须有 COMMENT
|
||
|
||
3. 分区字段选择
|
||
- 按时间分区:day_id, month_id
|
||
- 分区粒度:日分区最常用
|
||
|
||
4. 存储格式
|
||
- 推荐:PARQUET(列存储,压缩好)
|
||
- 可选:ORC、AVRO
|
||
|
||
5. Paimon 表特性
|
||
- primary-key:主键字段列表
|
||
- bucket:分桶数(影响并发)
|
||
- 支持 MERGE INTO 操作
|
||
|
||
6. 表属性配置
|
||
- 压缩格式:SNAPPY(推荐)、GZIP、LZ4
|
||
- 动态分区模式:dynamic(推荐)
|
||
*/ |