-- =====================================================================
-- @Name:             KUDU-D-SQL-{表名}-CREATE
-- @Version:          1.0
-- @Desc:             Kudu (via Impala) 建表模板
-- @TargetDatabase:   Apache Kudu (via Impala)
-- @说明:             Kudu 通过 Impala 访问，使用 Impala DDL 操作 Kudu 表
-- =====================================================================

-- ============================================================================
-- 场景1：基础表创建（Hash 分区）
-- ============================================================================
-- 适用：按主键 Hash 分布数据，写入和点查性能好

CREATE TABLE IF NOT EXISTS db_name.kudu_basic (
    -- 主键列（Kudu 表必须有主键）
    id              BIGINT          NOT NULL COMMENT '主键ID',
    
    -- 业务字段
    name            STRING          COMMENT '名称',
    category        STRING          COMMENT '类别',
    amount          DECIMAL(18,2)   COMMENT '金额',
    status          STRING          COMMENT '状态',
    created_at      TIMESTAMP       COMMENT '创建时间',
    updated_at      TIMESTAMP       COMMENT '更新时间'
)
PRIMARY KEY (id)
PARTITION BY HASH(id) PARTITIONS 8
STORED AS KUDU
TBLPROPERTIES (
    'kudu.num_tablet_replicas' = '3'
);

-- ============================================================================
-- 场景2：Hash + Range 组合分区
-- ============================================================================
-- 适用：按时间范围 + Hash 组合，兼顾范围查询和写入性能

CREATE TABLE IF NOT EXISTS db_name.kudu_range_hash (
    -- 主键列（必须包含分区列）
    id              BIGINT          NOT NULL COMMENT '主键ID',
    stat_date       STRING          NOT NULL COMMENT '统计日期 yyyy-MM-dd',
    
    -- 业务字段
    department      STRING          COMMENT '部门',
    metric_name     STRING          COMMENT '指标名称',
    metric_value    DECIMAL(18,2)   COMMENT '指标值',
    etl_time        TIMESTAMP       COMMENT '加工时间'
)
PRIMARY KEY (id, stat_date)
PARTITION BY 
    HASH(id) PARTITIONS 4,
    RANGE(stat_date) (
        PARTITION '2026-01-01' <= VALUES < '2026-02-01',
        PARTITION '2026-02-01' <= VALUES < '2026-03-01',
        PARTITION '2026-03-01' <= VALUES < '2026-04-01',
        PARTITION '2026-04-01' <= VALUES < '2026-05-01',
        PARTITION '2026-05-01' <= VALUES < '2026-06-01'
    )
STORED AS KUDU
TBLPROPERTIES (
    'kudu.num_tablet_replicas' = '3',
    'kudu.compression' = 'LZ4'
);

-- ============================================================================
-- 场景3：多列主键
-- ============================================================================

CREATE TABLE IF NOT EXISTS db_name.kudu_composite_pk (
    user_id         BIGINT          NOT NULL COMMENT '用户ID',
    order_date      STRING          NOT NULL COMMENT '订单日期',
    order_seq       INT             NOT NULL COMMENT '当日订单序号',
    
    user_name       STRING          COMMENT '用户姓名',
    product_name    STRING          COMMENT '商品名称',
    quantity        INT             COMMENT '数量',
    total_amount    DECIMAL(18,2)   COMMENT '总金额',
    status          STRING          COMMENT '状态',
    create_time     TIMESTAMP       COMMENT '创建时间'
)
PRIMARY KEY (user_id, order_date, order_seq)
PARTITION BY 
    HASH(user_id) PARTITIONS 8,
    RANGE(order_date) (
        PARTITION '2026-01-01' <= VALUES < '2026-02-01',
        PARTITION '2026-02-01' <= VALUES < '2026-03-01',
        PARTITION '2026-03-01' <= VALUES < '2026-04-01'
    )
STORED AS KUDU
TBLPROPERTIES (
    'kudu.num_tablet_replicas' = '3'
);

-- ============================================================================
-- 场景4：纯 Range 分区
-- ============================================================================
-- 适用：按时间顺序写入，范围查询多

CREATE TABLE IF NOT EXISTS db_name.kudu_range_only (
    id              BIGINT          NOT NULL COMMENT '主键ID',
    stat_date       STRING          NOT NULL COMMENT '统计日期',
    metric_value    DECIMAL(18,2)   COMMENT '指标值',
    dimension       STRING          COMMENT '维度',
    etl_time        TIMESTAMP       COMMENT '加工时间'
)
PRIMARY KEY (id, stat_date)
PARTITION BY RANGE(stat_date) (
    PARTITION '2026-01-01' <= VALUES < '2026-04-01',
    PARTITION '2026-04-01' <= VALUES < '2026-07-01',
    PARTITION '2026-07-01' <= VALUES < '2026-10-01',
    PARTITION '2026-10-01' <= VALUES < '2027-01-01'
)
STORED AS KUDU
TBLPROPERTIES (
    'kudu.num_tablet_replicas' = '3'
);

-- ============================================================================
-- 场景5：外部表映射已有 Kudu 表
-- ============================================================================

CREATE EXTERNAL TABLE IF NOT EXISTS db_name.kudu_external
STORED AS KUDU
TBLPROPERTIES (
    'kudu.master_addresses' = 'kudu-master-1:7051,kudu-master-2:7051,kudu-master-3:7051',
    'kudu.table_name' = 'impala.db_name.existing_table'
);

-- ============================================================================
-- 场景6：带压缩和副本配置
-- ============================================================================

CREATE TABLE IF NOT EXISTS db_name.kudu_with_props (
    id              BIGINT          NOT NULL COMMENT '主键ID',
    data_date       STRING          NOT NULL COMMENT '数据日期',
    content         STRING          COMMENT '内容',
    value           DOUBLE          COMMENT '数值'
)
PRIMARY KEY (id, data_date)
PARTITION BY 
    HASH(id) PARTITIONS 8,
    RANGE(data_date) (
        PARTITION '2026-01-01' <= VALUES < '2026-02-01',
        PARTITION '2026-02-01' <= VALUES < '2026-03-01'
    )
STORED AS KUDU
TBLPROPERTIES (
    'kudu.num_tablet_replicas' = '3',
    'kudu.compression' = 'LZ4',                        -- 压缩算法
    'kudu.encryption' = 'false'                        -- 加密
);

-- ============================================================================
-- 字段类型速查（Kudu 支持的类型）
-- ============================================================================
/*
| 类型          | 说明           | 适用场景               |
|---------------|----------------|------------------------|
| BOOLEAN       | 布尔           | 状态标志               |
| TINYINT       | 1字节整数      | 小范围枚举             |
| SMALLINT      | 2字节整数      | 小范围数值             |
| INT           | 4字节整数      | 数量、等级             |
| BIGINT        | 8字节整数      | ID、计数               |
| FLOAT         | 4字节浮点      | 近似计算               |
| DOUBLE        | 8字节浮点      | 科学计算               |
| DECIMAL(p,s)  | 定点数         | 金额、精确数值         |
| STRING        | 变长字符串     | 名称、描述             |
| VARCHAR(n)    | 变长字符串     | 限定长度字符串         |
| CHAR(n)       | 定长字符串     | 固定长度编码           |
| TIMESTAMP     | 时间戳         | 时间字段（微秒精度）   |
| DATE          | 日期           | 日期字段               |
| BINARY        | 二进制         | 二进制数据             |

注意：Kudu 不支持 ARRAY, MAP, STRUCT 等复杂类型
*/

-- ============================================================================
-- 建表规范说明
-- ============================================================================
/*
1. 主键约束（Kudu 特有）
   - 每张 Kudu 表必须有 PRIMARY KEY
   - 主键列不能为 NULL（必须 NOT NULL）
   - 主键值不可 UPDATE（只能删除后重新插入）
   - 主键列必须包含在分区列中

2. 分区策略
   - Hash 分区：均匀分布，适合写入和点查
   - Range 分区：按范围查询，适合时间序列
   - Hash + Range 组合：兼顾两者优势（推荐）
   - 分区数 = tablet 数量，影响并行度

3. 分区设计建议
   - Hash 分区数：建议 4 的倍数，参考数据量
   - Range 分区：按时间维度，定期添加新分区
   - 单个 tablet 建议 1GB~10GB

4. 副本数
   - 生产环境建议 3 副本（默认）
   - Raft 协议保证一致性

5. 压缩
   - 推荐 LZ4（速度和压缩比平衡）
   - 可选：SNAPPY, ZLIB, LZ4

6. 与 Hive/Spark 表的区别
   - Kudu 表支持 UPDATE 和 DELETE
   - Kudu 表不支持 INSERT OVERWRITE
   - Kudu 表不支持复杂类型（ARRAY, MAP, STRUCT）
   - Kudu 表主键有约束，Hive/Spark 无约束
*/
