-- =====================================================================
-- @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（推荐）
*/