未记录事实核验 · 状态:维护中

记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。

warning 适用范围与待维护事项

本文适用于具备SQL DDL、HDFS及Hive Metastore基础的人员,在隔离测试库练习Impala表结构管理;各节不是可顺序执行的完整脚本。正文未注明Impala版本,数据库属性、ORC读写、压缩及采样属性等行为尚未核实,不应直接用于生产。orders、customers、products、source_orders的建表与数据未提供,相关插入及视图需自备匹配素材。DROP、TRUNCATE、分区删除和重建表操作可能删除数据或丢失属性,须先备份并验证;分区大小与数量建议不是通用阈值。

表操作与DDL - Impala数据结构管理

abstract 📋 本节概览

  • 🎯 学习目标:掌握Impala中数据库和表的创建、修改、删除等DDL操作
  • 📚 前置知识:数据类型与函数、SQL DDL基础
  • ⏱️ 预计用时:75-90分钟(原稿估计,含练习,未实测)

🤔 为什么要学习DDL操作?

tip 💝 给数据架构新手的温暖指导

🤗 学习表操作就像学会搭建房子的框架!

如果你现在面对DDL时想:

  • "创建表有这么多选项,我该选哪些?"
  • "分区表、存储格式...这些概念好复杂!"
  • "怎么设计表结构才能让查询更快?"

别担心! 每个数据架构师都是从第一张表开始的 ✨

🏗️ 想象表操作就像建筑施工

建房子的过程:

  • 📐 CREATE TABLE = 画设计图(定义表结构)
  • 🧱 分区设计 = 房间分割(数据分区存储)
  • 🎨 存储格式 = 装修材料选择(性能优化)
  • 🔧 ALTER TABLE = 房屋改造(结构调整)
  • 🗑️ DROP TABLE = 拆除重建(删除表)

掌握了表操作,你就能为数据建造稳固的"家"! 🌟

🎯 Impala DDL概览

📊 DDL操作分类

%%{init: {"theme":"base","themeVariables":{"fontFamily":"PingFang SC, -apple-system, Source Han Serif SC, serif","fontSize":"16px","background":"#FDFBF5","primaryColor":"#FDFBF5","primaryTextColor":"#2D2A26","primaryBorderColor":"#6E6A60","secondaryColor":"#E8EFE8","secondaryBorderColor":"#8FA890","secondaryTextColor":"#2D2A26","tertiaryColor":"#FDFBF5","tertiaryBorderColor":"#9A9488","tertiaryTextColor":"#6E6A60","lineColor":"#6E6A60","textColor":"#2D2A26","mainBkg":"#FDFBF5","nodeBorder":"#2D5A3D","clusterBkg":"#F3EEDF","clusterBorder":"#9A9488","edgeLabelBackground":"#FDFBF5"},"flowchart":{"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":60,"rankSpacing":70,"useMaxWidth":false},"themeCSS":".node rect, .node polygon, .node circle { stroke-width: 1.5px; } .edgePath .path { stroke-width: 1.5px; } .cluster-label .nodeLabel, .cluster-label foreignObject { color: #2D2A26 !important; } .edgeLabel, .edgeLabel foreignObject { color: #2D2A26 !important; background-color: #FDFBF5; } .edgeLabel rect { fill: #FDFBF5; }"}}%%
flowchart TD
    A["Impala DDL操作"] --> B[📋 表结构管理]
    A --> C[🗂️ 数据库管理]
    A --> D[📁 分区管理]
    A --> E[📊 统计信息管理]
    A --> F[🔗 视图管理]
    B --> B1[CREATE TABLE<br/>创建表]
    B --> B2[ALTER TABLE<br/>修改表结构]
    B --> B3[DROP TABLE<br/>删除表]
    B --> B4[TRUNCATE TABLE<br/>清空表数据]
    C --> C1[CREATE DATABASE<br/>创建数据库]
    C --> C2[ALTER DATABASE<br/>修改数据库]
    C --> C3[DROP DATABASE<br/>删除数据库]
    C --> C4[USE DATABASE<br/>切换数据库]
    D --> D1[ADD PARTITION<br/>添加分区]
    D --> D2[DROP PARTITION<br/>删除分区]
    D --> D3[ALTER PARTITION<br/>修改分区]
    D --> D4[RECOVER PARTITIONS<br/>恢复分区]
    E --> E1[COMPUTE STATS<br/>计算统计信息]
    E --> E2[SHOW STATS<br/>查看统计信息]
    E --> E3[DROP STATS<br/>删除统计信息]
    F --> F1[CREATE VIEW<br/>创建视图]
    F --> F2[DROP VIEW<br/>删除视图]
    style A fill:#e1f5fe
    style B fill:#f3e5f5
    style C fill:#fff3e0
    style D fill:#e8f5e8
    style E fill:#fce4ec
    style F fill:#f9fbe7

🗄️ 数据库管理

📋 创建和管理数据库

-- 1. 创建数据库
CREATE DATABASE IF NOT EXISTS sales_analytics
COMMENT '销售数据分析数据库'
LOCATION '/user/hive/warehouse/sales_analytics.db';

-- 2. 切换数据库
USE sales_analytics;

-- 3. 查看数据库信息
DESCRIBE DATABASE sales_analytics;

-- 4. 查看所有数据库
SHOW DATABASES;

-- 5. 查看数据库详细信息
SHOW CREATE DATABASE sales_analytics;

🔧 数据库属性管理

-- 修改数据库属性
ALTER DATABASE sales_analytics SET DBPROPERTIES (
    'department' = 'analytics',
    'owner' = 'data_team',
    'created_date' = '2024-01-15'
);

-- 查看数据库属性
DESCRIBE DATABASE EXTENDED sales_analytics;

🏗️ 表创建详解

📊 基础表创建

-- 1. 最简单的表创建
CREATE TABLE simple_customers (
    customer_id STRING,
    customer_name STRING,
    email STRING,
    phone STRING
);

-- 2. 带列注释和表注释的表(本例未声明约束)
CREATE TABLE customers_detailed (
    customer_id STRING COMMENT '客户唯一标识',
    customer_name STRING COMMENT '客户姓名',
    email STRING COMMENT '电子邮箱',
    phone STRING COMMENT '联系电话',
    registration_date DATE COMMENT '注册日期',
    credit_score INT COMMENT '信用评分',
    is_active BOOLEAN COMMENT '是否活跃客户'
) 
COMMENT '客户详细信息表'
STORED AS PARQUET;

🎯 高级表创建选项

-- 3. 完整的表创建语法示例
CREATE TABLE sales_fact (
    order_id STRING,
    customer_id STRING,
    product_id STRING,
    order_date DATE,
    quantity INT,
    unit_price DECIMAL(10,2),
    discount_rate DECIMAL(3,2),
    sales_amount DECIMAL(12,2),
    region STRING
)
COMMENT '销售事实表'
PARTITIONED BY (
    year INT COMMENT '年份分区',
    month INT COMMENT '月份分区'
)
STORED AS PARQUET
LOCATION '/user/data/sales_fact'
TBLPROPERTIES (
    'parquet.compression' = 'snappy',
    'impala.enable.stats.extrapolation' = 'true',
    'created_by' = 'data_team',
    'table_type' = 'fact'
);

📁 存储格式选择

-- 4. 不同存储格式的表创建

-- Parquet格式(推荐)
CREATE TABLE orders_parquet (
    order_id STRING,
    customer_id STRING,
    order_amount DECIMAL(12,2),
    order_date DATE
) 
STORED AS PARQUET
TBLPROPERTIES ('parquet.compression' = 'snappy');

-- ORC格式
CREATE TABLE orders_orc (
    order_id STRING,
    customer_id STRING,
    order_amount DECIMAL(12,2),
    order_date DATE
) 
STORED AS ORC
TBLPROPERTIES ('orc.compress' = 'ZLIB');

-- Avro格式
CREATE TABLE orders_avro (
    order_id STRING,
    customer_id STRING,
    order_amount DECIMAL(12,2),
    order_date DATE
) 
STORED AS AVRO;

-- 文本格式(用于数据导入)
CREATE TABLE orders_text (
    order_id STRING,
    customer_id STRING,
    order_amount DECIMAL(12,2),
    order_date DATE
) 
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;

🗂️ 分区表设计

📅 时间分区表

-- 1. 按日期分区的销售表
CREATE TABLE daily_sales (
    order_id STRING,
    customer_id STRING,
    product_id STRING,
    quantity INT,
    unit_price DECIMAL(10,2),
    order_time TIMESTAMP
)
PARTITIONED BY (
    order_date DATE
)
STORED AS PARQUET;

-- 2. 多级分区表(年-月-日)
CREATE TABLE sales_multi_partition (
    order_id STRING,
    customer_id STRING,
    product_id STRING,
    quantity INT,
    unit_price DECIMAL(10,2),
    order_timestamp TIMESTAMP
)
PARTITIONED BY (
    year INT,
    month INT,
    day INT
)
STORED AS PARQUET;

-- 3. 业务分区表(地区+日期)
CREATE TABLE regional_sales (
    order_id STRING,
    customer_id STRING,
    product_id STRING,
    quantity INT,
    unit_price DECIMAL(10,2)
)
PARTITIONED BY (
    region STRING,
    order_date DATE
)
STORED AS PARQUET;

🔧 分区操作管理

-- 添加分区
ALTER TABLE daily_sales ADD PARTITION (order_date='2024-01-15');
ALTER TABLE daily_sales ADD PARTITION (order_date='2024-01-16');

-- 添加多个分区
ALTER TABLE sales_multi_partition ADD PARTITION (year=2024, month=1, day=15);
ALTER TABLE sales_multi_partition ADD PARTITION (year=2024, month=1, day=16);

-- 添加分区并指定位置
ALTER TABLE daily_sales ADD PARTITION (order_date='2024-01-17')
LOCATION '/user/data/daily_sales/order_date=2024-01-17';

-- 删除分区
ALTER TABLE daily_sales DROP PARTITION (order_date='2024-01-15');

-- 删除多个分区
ALTER TABLE daily_sales DROP PARTITION (order_date < '2024-01-10');

-- 查看分区
SHOW PARTITIONS daily_sales;

-- 恢复分区(扫描符合分区目录命名规则的HDFS目录并补充元数据,不恢复已删除的数据)
-- MSCK REPAIR TABLE是Hive语法;在Impala中使用以下语句
ALTER TABLE daily_sales RECOVER PARTITIONS;

📊 分区数据插入

-- 1. 静态分区插入
INSERT INTO daily_sales PARTITION (order_date='2024-01-15')
VALUES 
('ORD001', 'C001', 'P001', 2, 999.99, '2024-01-15 10:30:00'),
('ORD002', 'C002', 'P002', 1, 1299.99, '2024-01-15 14:20:00');

-- 2. 动态分区插入
-- Impala动态分区插入无需设置Hive的hive.exec.dynamic.partition参数

INSERT INTO daily_sales PARTITION (order_date)
SELECT 
    order_id,
    customer_id,
    product_id,
    quantity,
    unit_price,
    order_time,
    CAST(order_time AS DATE) as order_date
FROM source_orders
WHERE CAST(order_time AS DATE) = '2024-01-15';

-- 3. 多级动态分区插入
INSERT INTO sales_multi_partition PARTITION (year, month, day)
SELECT 
    order_id,
    customer_id,
    product_id,
    quantity,
    unit_price,
    order_timestamp,
    YEAR(order_timestamp) as year,
    MONTH(order_timestamp) as month,
    DAY(order_timestamp) as day
FROM source_orders
WHERE order_timestamp >= '2024-01-15 00:00:00'
  AND order_timestamp < '2024-01-16 00:00:00';

🔄 表结构修改

📝 列操作

-- 1. 添加列
ALTER TABLE customers_detailed ADD COLUMNS (
    last_login_date DATE COMMENT '最后登录日期',
    lifetime_value DECIMAL(12,2) COMMENT '客户生命周期价值',
    preferred_contact STRING COMMENT '首选联系方式'
);

-- 2. 修改列名
ALTER TABLE customers_detailed CHANGE COLUMN phone contact_phone STRING COMMENT '联系电话';

-- 3. 修改列类型(需要兼容性)
ALTER TABLE customers_detailed CHANGE COLUMN credit_score credit_score BIGINT COMMENT '信用评分';

-- 4. 通过重建表删除列(是否支持直接DROP COLUMN须按目标版本核对)
-- 方法:创建新表,插入数据,删除原表,重命名新表
-- 仅在已备份的测试库执行:先核对行数、数据、格式、注释、属性和权限,再删除原表
CREATE TABLE customers_detailed_new AS
SELECT 
    customer_id,
    customer_name,
    email,
    contact_phone,
    registration_date,
    is_active,
    last_login_date,
    lifetime_value,
    preferred_contact
FROM customers_detailed;

DROP TABLE customers_detailed;
ALTER TABLE customers_detailed_new RENAME TO customers_detailed;

🏷️ 表属性修改

-- 1. 修改表注释
ALTER TABLE customers_detailed SET TBLPROPERTIES ('comment' = '客户详细信息表-更新版本');

-- 2. 修改存储属性
ALTER TABLE customers_detailed SET TBLPROPERTIES (
    'parquet.compression' = 'gzip',
    'impala.enable.stats.extrapolation' = 'true'
);

-- 3. 修改表位置
ALTER TABLE customers_detailed SET LOCATION '/user/data/new_location/customers_detailed';

-- 4. 重命名表
ALTER TABLE customers_detailed RENAME TO customer_master;

📊 外部表和临时表

🔗 外部表创建

-- 1. 创建外部表
CREATE EXTERNAL TABLE external_log_data (
    log_time TIMESTAMP,
    user_id STRING,
    action STRING,
    ip_address STRING,
    user_agent STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '/external/log_data/';

-- 2. 外部Parquet表
CREATE EXTERNAL TABLE external_sales_data (
    order_id STRING,
    customer_id STRING,
    product_id STRING,
    order_amount DECIMAL(12,2),
    order_date DATE
)
STORED AS PARQUET
LOCATION '/external/sales_parquet/';

-- 3. 外部分区表
CREATE EXTERNAL TABLE external_partitioned_logs (
    log_time TIMESTAMP,
    user_id STRING,
    action STRING,
    ip_address STRING
)
PARTITIONED BY (log_date DATE)
STORED AS PARQUET
LOCATION '/external/partitioned_logs/';

⚡ 临时表和CTE

-- 1. 使用CTE定义仅在当前语句中有效的命名查询(不创建视图对象)
WITH temp_customer_summary AS (
    SELECT 
        customer_id,
        COUNT(*) as order_count,
        SUM(order_amount) as total_amount,
        MAX(order_date) as last_order_date
    FROM orders
    GROUP BY customer_id
),
temp_customer_segments AS (
    SELECT 
        customer_id,
        order_count,
        total_amount,
        CASE 
            WHEN total_amount >= 10000 THEN 'VIP'
            WHEN total_amount >= 5000 THEN 'Gold'
            WHEN total_amount >= 1000 THEN 'Silver'
            ELSE 'Bronze'
        END as customer_segment
    FROM temp_customer_summary
)
SELECT 
    customer_segment,
    COUNT(*) as customer_count,
    AVG(total_amount) as avg_amount
FROM temp_customer_segments
GROUP BY customer_segment;

-- 2. 使用CREATE TABLE AS创建普通持久表作为中间结果(使用后需显式删除)
CREATE TABLE temp_monthly_sales AS
SELECT 
    YEAR(order_date) as year,
    MONTH(order_date) as month,
    COUNT(*) as order_count,
    SUM(order_amount) as total_sales
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY YEAR(order_date), MONTH(order_date);

📈 视图管理

👁️ 创建和管理视图

-- 1. 创建简单视图
CREATE VIEW customer_summary AS
SELECT 
    c.customer_id,
    c.customer_name,
    c.email,
    COUNT(o.order_id) as total_orders,
    SUM(o.order_amount) as total_spent,
    MAX(o.order_date) as last_order_date
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.customer_name, c.email;

-- 2. 创建复杂业务视图
CREATE VIEW sales_dashboard AS
SELECT 
    SUBSTR(CAST(order_date AS STRING), 1, 7) as month,
    region,
    product_category,
    COUNT(*) as order_count,
    SUM(quantity) as total_quantity,
    SUM(order_amount) as total_sales,
    AVG(order_amount) as avg_order_value,
    COUNT(DISTINCT customer_id) as unique_customers
FROM orders o
JOIN products p ON o.product_id = p.product_id
WHERE order_date >= DATE_SUB(CURRENT_DATE(), 365)
GROUP BY 
    SUBSTR(CAST(order_date AS STRING), 1, 7),
    region,
    product_category;

-- 3. 查看视图定义
SHOW CREATE VIEW customer_summary;

-- 4. 删除视图
DROP VIEW IF EXISTS customer_summary;

🔍 物化视图(通过表实现)

-- Impala不支持物化视图,但可以通过定期刷新的表来实现类似功能

-- 1. 创建"物化视图"表
CREATE TABLE mv_daily_sales_summary
STORED AS PARQUET
AS
SELECT 
    order_date,
    region,
    COUNT(*) as order_count,
    SUM(order_amount) as total_sales,
    AVG(order_amount) as avg_order_value
FROM orders
GROUP BY order_date, region;

-- 2. 创建刷新"物化视图"的存储过程(伪代码)
-- 实际中需要通过调度工具执行
/*
TRUNCATE TABLE mv_daily_sales_summary;
INSERT INTO mv_daily_sales_summary
SELECT 
    order_date,
    region,
    COUNT(*) as order_count,
    SUM(order_amount) as total_sales,
    AVG(order_amount) as avg_order_value
FROM orders
GROUP BY order_date, region;

COMPUTE STATS mv_daily_sales_summary;
*/

📊 统计信息管理

📈 表统计信息

-- 1. 计算表统计信息
COMPUTE STATS customers_detailed;
COMPUTE STATS orders;

-- 2. 计算增量统计信息(对分区表)
COMPUTE INCREMENTAL STATS daily_sales;

-- 3. 计算指定分区的统计信息
COMPUTE INCREMENTAL STATS daily_sales PARTITION (order_date='2024-01-15');

-- 4. 查看表统计信息
SHOW TABLE STATS customers_detailed;
SHOW TABLE STATS orders;

-- 5. 查看列统计信息
SHOW COLUMN STATS customers_detailed;
SHOW COLUMN STATS orders;

-- 6. 删除统计信息
DROP STATS customers_detailed;
DROP INCREMENTAL STATS daily_sales PARTITION (order_date='2024-01-15');

🎯 统计信息优化

-- 1. 设置表属性以启用统计信息外推
ALTER TABLE orders SET TBLPROPERTIES (
    'impala.enable.stats.extrapolation' = 'true'
);

-- 2. 对Parquet表尝试采样计算统计信息(先核对目标版本支持;采样比例不保证等于实际读取比例)
COMPUTE STATS customers_detailed TABLESAMPLE SYSTEM(10);

-- 3. 查看统计信息设置
DESCRIBE FORMATTED customers_detailed;

🔧 表维护操作

🧹 表清理和优化

-- 1. 清空表数据(保留结构)
TRUNCATE TABLE temp_monthly_sales;

-- 2. 刷新表元数据
REFRESH customers_detailed;
REFRESH orders;

-- 3. 使表元数据失效(重新加载)
INVALIDATE METADATA customers_detailed;
INVALIDATE METADATA;  -- 使所有表的元数据失效,后续按需重新加载;不是立即刷新所有表

-- 4. 检查表结构
DESCRIBE customers_detailed;
DESCRIBE FORMATTED customers_detailed;

-- 5. 显示建表语句
SHOW CREATE TABLE customers_detailed;

🔍 表信息查询

-- 1. 查看所有表
SHOW TABLES;
SHOW TABLES IN sales_analytics;

-- 2. 查看表模式匹配
SHOW TABLES LIKE 'customer*';
SHOW TABLES LIKE '*sales*';

-- 3. 查看表详细信息
DESCRIBE EXTENDED customers_detailed;

-- 4. 查看表的文件信息
SHOW FILES IN customers_detailed;

-- 5. 查看表的分区信息
SHOW PARTITIONS daily_sales;
SHOW PARTITIONS sales_multi_partition;

🎯 DDL最佳实践

📋 设计原则

tip 💡 **表设计最佳实践**

1. 选择合适的存储格式

  • 📊 分析型查询:使用Parquet格式
  • 🔍 频繁查询小表:使用Parquet + Snappy压缩
  • 📝 日志数据:可考虑ORC格式
  • 🔄 临时数据交换:使用文本格式

2. 合理设计分区

  • 📅 时间分区:按日、月、年分区,避免过细分区
  • 🌍 业务分区:按地区、部门、产品类别
  • ⚖️ 分区平衡:原稿未核实的示例参考为每个分区256MB-1GB;实际应结合文件大小、查询过滤条件、数据增长和集群资源验证
  • 🚫 避免过度分区:原稿未核实的示例参考为分区数不超过几千个,并非Impala通用上限;应评估元数据开销和实际查询性能

3. 优化查询性能

  • 📊 定期更新统计信息:保证查询优化器准确
  • 🔧 合理设置表属性:启用性能优化选项
  • 📝 规范命名约定:便于维护和理解

🎯 性能优化建议

-- 1. 创建高性能表的模板
CREATE TABLE high_performance_table (
    id BIGINT,
    business_date DATE,
    category STRING,
    amount DECIMAL(12,2),
    quantity INT,
    description STRING
)
COMMENT '高性能表模板'
PARTITIONED BY (
    year INT,
    month INT
)
STORED AS PARQUET
TBLPROPERTIES (
    'parquet.compression' = 'snappy',
    'impala.enable.stats.extrapolation' = 'true',
    'parquet.page.size' = '1048576',  -- 1MB页大小
    'parquet.block.size' = '134217728'  -- 128MB块大小
);

-- 2. 批量创建分区(脚本示例)
-- 实际中可以通过脚本生成
ALTER TABLE high_performance_table ADD PARTITION (year=2024, month=1);
ALTER TABLE high_performance_table ADD PARTITION (year=2024, month=2);
ALTER TABLE high_performance_table ADD PARTITION (year=2024, month=3);
-- ... 更多分区

-- 3. 创建按指定列排序写入的普通表(不是索引,优化效果需结合查询验证)
CREATE TABLE indexed_customer_orders
STORED AS PARQUET
TBLPROPERTIES ('sort.columns' = 'customer_id,order_date')
AS
SELECT *
FROM orders
ORDER BY customer_id, order_date;

🎉 表操作与DDL学习收获

success 🌟 **完成练习并验证结果后,你将熟悉Impala表结构管理的核心操作!**

你现在具备的能力:

  • ✅ 数据库管理:创建、修改、删除数据库的完整操作
  • ✅ 表结构设计:合理选择数据类型、存储格式、分区策略
  • ✅ 分区管理:设计和维护高效的分区表结构
  • ✅ 性能优化:通过DDL优化查询性能
  • ✅ 统计信息管理:维护查询优化器所需的统计数据
  • ✅ 视图设计:创建业务视图简化复杂查询
  • ✅ 表维护:日常表维护和优化操作

完成并验证这些练习,可为数据仓库表设计打下基础;高性能设计仍需结合实际负载、版本和集群资源测试。 🚀

🎯 实战技能验证

完成以下挑战来验证你的DDL技能:

-- 🎯 挑战1:设计电商数据仓库表结构
-- 创建订单事实表,考虑分区、性能、扩展性

CREATE TABLE ecommerce_orders (
    order_id STRING COMMENT '订单编号',
    customer_id STRING COMMENT '客户ID',
    product_id STRING COMMENT '产品ID',
    sku STRING COMMENT '产品SKU',
    quantity INT COMMENT '购买数量',
    unit_price DECIMAL(10,2) COMMENT '单价',
    discount_amount DECIMAL(10,2) COMMENT '折扣金额',
    tax_amount DECIMAL(10,2) COMMENT '税费',
    shipping_cost DECIMAL(10,2) COMMENT '运费',
    total_amount DECIMAL(12,2) COMMENT '订单总额',
    order_status STRING COMMENT '订单状态',
    payment_method STRING COMMENT '支付方式',
    shipping_address STRING COMMENT '收货地址',
    order_timestamp TIMESTAMP COMMENT '下单时间'
)
COMMENT '电商订单事实表'
PARTITIONED BY (
    order_date DATE COMMENT '订单日期分区',
    region STRING COMMENT '地区分区'
)
STORED AS PARQUET
TBLPROPERTIES (
    'parquet.compression' = 'snappy',
    'impala.enable.stats.extrapolation' = 'true'
);

-- 🎯 挑战2:创建客户维度表
CREATE TABLE customer_dimension (
    customer_id STRING COMMENT '客户唯一标识',
    customer_type STRING COMMENT '客户类型',
    registration_date DATE COMMENT '注册日期',
    first_name STRING COMMENT '名',
    last_name STRING COMMENT '姓',
    email STRING COMMENT '邮箱',
    phone STRING COMMENT '电话',
    birth_date DATE COMMENT '生日',
    gender STRING COMMENT '性别',
    city STRING COMMENT '城市',
    state STRING COMMENT '省份',
    country STRING COMMENT '国家',
    customer_segment STRING COMMENT '客户细分',
    lifetime_value DECIMAL(12,2) COMMENT '生命周期价值',
    last_updated TIMESTAMP COMMENT '最后更新时间'
)
COMMENT '客户维度表'
STORED AS PARQUET
TBLPROPERTIES (
    'parquet.compression' = 'snappy'
);

-- 🎯 挑战3:创建产品维度表并建立视图
CREATE TABLE product_dimension (
    product_id STRING COMMENT '产品ID',
    sku STRING COMMENT '产品SKU',
    product_name STRING COMMENT '产品名称',
    brand STRING COMMENT '品牌',
    category_l1 STRING COMMENT '一级类目',
    category_l2 STRING COMMENT '二级类目',
    category_l3 STRING COMMENT '三级类目',
    cost_price DECIMAL(10,2) COMMENT '成本价',
    list_price DECIMAL(10,2) COMMENT '标价',
    weight DECIMAL(8,3) COMMENT '重量',
    dimensions STRING COMMENT '尺寸',
    color STRING COMMENT '颜色',
    size STRING COMMENT '大小',
    is_active BOOLEAN COMMENT '是否有效',
    created_date DATE COMMENT '创建日期',
    last_updated TIMESTAMP COMMENT '最后更新时间'
)
COMMENT '产品维度表'
STORED AS PARQUET;

-- 创建销售分析视图
CREATE VIEW sales_analysis_view AS
SELECT 
    o.order_date,
    o.region,
    c.customer_segment,
    p.category_l1,
    p.brand,
    COUNT(*) as order_count,
    SUM(o.quantity) as total_quantity,
    SUM(o.total_amount) as total_sales,
    AVG(o.total_amount) as avg_order_value,
    COUNT(DISTINCT o.customer_id) as unique_customers
FROM ecommerce_orders o
JOIN customer_dimension c ON o.customer_id = c.customer_id
JOIN product_dimension p ON o.product_id = p.product_id
WHERE o.order_status NOT IN ('cancelled', 'refunded')
GROUP BY 
    o.order_date,
    o.region,
    c.customer_segment,
    p.category_l1,
    p.brand;

🎯 下一步学习建议

立即练习:

  • [ ] 设计一个完整的业务数据仓库表结构
  • [ ] 练习分区表的设计和维护
  • [ ] 体验不同存储格式的性能差异

继续学习:

quote 💭 **数据架构设计的智慧**

好的表设计是数据分析成功的基础:

  • 🎯 前瞻性设计:考虑未来数据增长和查询需求
  • ⚡ 性能优先:选择合适的分区和存储格式
  • 🔧 维护友好:设计易于维护和扩展的表结构
  • 📊 业务理解:表设计要体现业务逻辑和分析需求

优秀的数据架构师不仅是技术专家,更是业务理解者! ✨


创建时间:2024-12-11
温度指数:⭐⭐⭐⭐⭐ (实用性强,案例完整)
预计学习时长:75-90分钟
下一步学习:08-查询优化基础|查询优化基本概念 → 09-连接与子查询|连接与子查询

#Impala #DDL #表设计 #分区管理 #存储优化 #数据架构 #性能调优