Hive外表(XIHE SQL)
AnalyticDB for MySQL的XIHE引擎支持通过Hive外表方式直接读写存储在OSS上的Parquet、ORC、CSV、JSON和RCFile格式数据文件。您可以通过标准SQL创建外部表并进行数据查询和写入,实现数据湖联邦分析。本文介绍Hive外表(XIHE SQL)的方法。
支持能力概览
能力 | 支持状态 |
CREATE EXTERNAL TABLE(建表) | 支持 |
DROP TABLE / SHOW CREATE TABLE / DESCRIBE | 支持 |
PARTITIONED BY(分区表) | 支持 |
MSCK REPAIR TABLE(分区发现) | 支持 |
ALTER TABLE DROP PARTITION | 支持 |
INSERT INTO / INSERT OVERWRITE | 支持 |
SELECT / JOIN / 聚合查询 | 支持 |
CREATE VIEW / CTE | 支持 |
分区投影(Partition Projection) | 支持 |
ANALYZE TABLE(统计信息收集) | 支持 |
ALTER TABLE ADD COLUMNS / RENAME | 支持 |
UPDATE / DELETE | 不支持 |
MERGE INTO | 不支持 |
前提条件
集群的产品系列为企业版、基础版或湖仓版。
集群的内核版本为3.1.8.0及以上版本。
已创建外部数据库。创建方法请参见CREATE EXTERNAL DATABASE。
OSS路径已存在且包含与
STORED AS声明一致格式的数据文件,或为空目录(用于写入)。分区表要求OSS路径遵循Hive风格
key=value/分区目录命名规范。
快速开始
以下示例演示如何通过4步完成从建库到查询的完整流程。
-- Step 1:创建外部数据库
CREATE EXTERNAL DATABASE IF NOT EXISTS ext_db;
-- Step 2:创建Parquet格式Hive外表
CREATE EXTERNAL TABLE ext_db.orders (
id INT,
name VARCHAR(100),
amount DOUBLE
)
STORED AS PARQUET
LOCATION 'oss://<YOUR-BUCKET>/warehouse/ext_db/orders/';
-- Step 3:写入数据
INSERT INTO ext_db.orders
SELECT 1, '张三', 99.00
UNION ALL
SELECT 2, '李四', 188.50
UNION ALL
SELECT 3, '王五', 320.00;
-- Step 4:查询
SELECT name, SUM(amount) AS total
FROM ext_db.orders
GROUP BY name
ORDER BY total DESC;预期输出:
name | total |
王五 | 320.00 |
李四 | 188.50 |
张三 | 99.00 |
建库
Hive外表需存放在外部数据库中。通过以下语法创建外部数据库:
CREATE EXTERNAL DATABASE [IF NOT EXISTS] <db_name>;建表
语法
CREATE EXTERNAL TABLE [IF NOT EXISTS] <db>.<table> (
<col1> <type1>,
<col2> <type2>,
...
)
[PARTITIONED BY (<part_col1> <type1>[, <part_col2> <type2>, ...])]
[ROW FORMAT DELIMITED FIELDS TERMINATED BY '<delimiter>']
[ROW FORMAT SERDE '<serde_class>' [WITH SERDEPROPERTIES (...)]]
STORED AS <FORMAT>
LOCATION '<oss_path>'
[TBLPROPERTIES (
'<key1>' = '<value1>',
...
)];子句 | 必填 | 说明 |
| 是 | 数据文件格式: 详见下方存储格式。 |
| 是 | OSS数据文件存储路径。仅支持 |
| 否 | Hive风格的分区列定义。分区目录需遵循 |
| 否 | 指定行格式。支持三种语法,详见下方ROW FORMAT。仅TEXTFILE格式需要。 |
| 否 | 表属性。可设置 |
存储格式
格式 | 关键字 | 说明 | 适用场景 |
Parquet |
| 列式存储,高压缩比,支持谓词下推 | 分析型查询(推荐) |
ORC |
| 列式存储,Hive生态常用格式 | Hive生态互通 |
TextFile |
| 文本格式,支持自定义分隔符 | CSV/TSV文本数据 |
JSON |
| JSON Lines格式 | 日志数据 |
RCFile |
| 行列混合存储 | 兼容旧Hive数据 |
压缩类型
通过TBLPROPERTIES指定写入时的压缩算法:
TBLPROPERTIES ('compress_type' = 'SNAPPY')压缩类型 | 说明 |
| 不压缩 |
| 快速压缩/解压(推荐) |
| 高压缩比 |
| 高压缩比+快速解压 |
| 极速压缩/解压 |
ROW FORMAT
TEXTFILE格式支持以下三种行格式定义方式:
语法 | 说明 |
| 指定字段分隔符(逗号、制表符等) |
| 指定自定义SerDe类,如 |
| 设置SerDe属性,如 |
OpenCSVSerde示例(要求所有列类型为STRING):
CREATE EXTERNAL TABLE ext_db.csv_serde (
col1 STRING,
col2 STRING,
col3 STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES ('separatorChar' = ',', 'quoteChar' = '"')
STORED AS TEXTFILE
LOCATION 'oss://<YOUR-BUCKET>/data/csv_serde/';示例
Parquet外表示例
CREATE EXTERNAL DATABASE IF NOT EXISTS ext_hive_db;
CREATE EXTERNAL TABLE ext_hive_db.orders (
order_id BIGINT,
user_id BIGINT,
status VARCHAR(50),
amount DOUBLE,
created_at TIMESTAMP
)
STORED AS PARQUET
LOCATION 'oss://<YOUR-BUCKET>/warehouse/ext_hive_db/orders/';ORC外表示例
CREATE EXTERNAL TABLE ext_hive_db.access_log (
id BIGINT,
ip VARCHAR(50),
path VARCHAR(200),
status_code INT,
response_time DOUBLE
)
STORED AS ORC
LOCATION 'oss://<YOUR-BUCKET>/warehouse/ext_hive_db/access_log/';CSV(TEXTFILE)外表示例
CREATE EXTERNAL TABLE ext_hive_db.csv_data (
id INT,
name VARCHAR(100),
amount DOUBLE
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 'oss://<YOUR-BUCKET>/warehouse/ext_hive_db/csv_data/'
TBLPROPERTIES ('skip_header_line_count' = '1');skip_header_line_count用于跳过CSV文件的表头行,设置为'1'表示跳过第一行。
JSON外表示例
CREATE EXTERNAL TABLE ext_hive_db.json_logs (
timestamp_col TIMESTAMP,
level VARCHAR(10),
message VARCHAR(1024)
)
STORED AS JSON
LOCATION 'oss://<YOUR-BUCKET>/warehouse/ext_hive_db/json_logs/';RCFile外表示例
CREATE EXTERNAL TABLE ext_hive_db.legacy_data (
id BIGINT,
name VARCHAR(100),
value DOUBLE
)
STORED AS RCFILE
LOCATION 'oss://<YOUR-BUCKET>/warehouse/ext_hive_db/legacy_data/';复杂类型外表示例
-- ARRAY和MAP类型
CREATE EXTERNAL TABLE ext_hive_db.complex_types (
id BIGINT,
tags ARRAY<VARCHAR(100)>,
attrs MAP<STRING, STRING>
)
STORED AS PARQUET
LOCATION 'oss://<YOUR-BUCKET>/warehouse/ext_hive_db/complex_types/';
-- STRUCT类型
CREATE EXTERNAL TABLE ext_hive_db.struct_table (
id INT,
info STRUCT<name: STRING, age: INT, city: STRING>
)
STORED AS PARQUET
LOCATION 'oss://<YOUR-BUCKET>/warehouse/ext_hive_db/struct_table/';分区表示例
-- 单级分区
CREATE EXTERNAL TABLE ext_hive_db.events (
event_id BIGINT,
event_type VARCHAR(50),
payload VARCHAR(2048)
)
PARTITIONED BY (dt STRING)
STORED AS PARQUET
LOCATION 'oss://<YOUR-BUCKET>/warehouse/ext_hive_db/events/';
-- 多级分区
CREATE EXTERNAL TABLE ext_hive_db.events_multi (
event_id BIGINT,
event_type VARCHAR(50)
)
PARTITIONED BY (dt STRING, region INT)
STORED AS PARQUET
LOCATION 'oss://<YOUR-BUCKET>/warehouse/ext_hive_db/events_multi/';分区表创建后必须执行MSCK REPAIR TABLE发现分区,否则查询返回空结果。详见分区管理。
支持的数据类型
AnalyticDB类型 | 说明 | 对应Hive类型 |
| 布尔 | boolean |
| 1/2字节整数 | tinyint / smallint |
| 4/8字节整数 | int / bigint |
| 单/双精度浮点 | float / double |
| 定点数 | decimal |
| 变长字符串 | string / varchar |
| 日期/时间戳 | date / timestamp |
| 二进制 | binary |
| 复杂类型 | array / map / struct |
其他DDL操作
-- 查看表的完整建表语句
SHOW CREATE TABLE ext_hive_db.orders;
-- 查看列结构
DESCRIBE ext_hive_db.orders;
-- 删除外部表
DROP TABLE IF EXISTS ext_hive_db.orders;
-- 添加列
ALTER TABLE ext_hive_db.orders ADD COLUMNS (region VARCHAR(50));
-- 重命名表
ALTER TABLE ext_hive_db.orders RENAME TO ext_hive_db.orders_archive;DROP TABLE仅删除AnalyticDB中的外部表定义,不删除OSS上的数据文件。
写入数据
INSERT INTO(追加写入)
INSERT INTO支持从VALUES插入数据和从其他表插入数据两种方式。
-- 从VALUES插入
INSERT INTO ext_hive_db.orders
SELECT * FROM VALUES
ROW(1001, 501, 'paid', 299.90, TIMESTAMP '2026-06-11 10:00:00'),
ROW(1002, 502, 'pending', 158.00, TIMESTAMP '2026-06-11 10:05:00'),
ROW(1003, 503, 'shipped', 450.00, TIMESTAMP '2026-06-12 10:10:00');
-- 从其他表插入
INSERT INTO ext_hive_db.orders
SELECT * FROM internal_db.source_table
WHERE created_at >= TIMESTAMP '2026-06-01 00:00:00';
-- 分区表写入(分区列作为SELECT最后的列)
INSERT INTO ext_hive_db.events
SELECT 1, 'click', '{"page":"home"}', '2026-06-11'
UNION ALL
SELECT 2, 'view', '{"page":"product"}', '2026-06-12';分区表写入时,分区列的值必须包含在SELECT结果的最后几列中。引擎根据分区列的值自动写入对应的分区目录。不支持INSERT INTO ... PARTITION (dt='...')语法。
INSERT OVERWRITE(覆写)
INSERT OVERWRITE支持非分区表全表覆写和分区表动态分区覆写两种场景。
-- 非分区表:全表覆写
INSERT OVERWRITE ext_hive_db.orders
SELECT * FROM staging_db.new_orders;
-- 分区表:动态分区覆写(仅替换涉及的分区,其他分区不受影响)
INSERT OVERWRITE ext_hive_db.events
SELECT 10, 'purchase', '{"item":"laptop"}', '2026-06-11'
UNION ALL
SELECT 11, 'refund', '{"item":"phone"}', '2026-06-11';分区表覆写后,仅dt='2026-06-11'分区的数据被替换,其他日期分区不受影响。
内表与外表互导
-- 将内表数据导出到OSS(Parquet格式)
INSERT INTO ext_hive_db.orders
SELECT * FROM internal_db.source_table
WHERE created_at >= TIMESTAMP '2026-06-01 00:00:00';
-- 将OSS外表数据导入内表
INSERT INTO internal_db.target_table
SELECT * FROM ext_hive_db.orders
WHERE status = 'paid';查询数据
查询能力
查询能力 | 支持状态 |
SELECT / WHERE / ORDER BY / LIMIT | 支持 |
GROUP BY + 聚合函数(COUNT/SUM/AVG/MIN/MAX) | 支持 |
HAVING / DISTINCT | 支持 |
子查询(IN / EXISTS) | 支持 |
JOIN(INNER / LEFT / RIGHT / FULL / CROSS) | 支持 |
UNION ALL / UNION | 支持 |
CASE WHEN / BETWEEN / IN / LIKE | 支持 |
分区裁剪(WHERE中指定分区列时自动生效) | 支持 |
谓词下推(Parquet/ORC格式) | 支持 |
基本查询与分区裁剪
-- 条件过滤
SELECT order_id, status, amount
FROM ext_hive_db.orders
WHERE status = 'paid' AND amount > 100
ORDER BY amount DESC
LIMIT 10;
-- 聚合查询
SELECT status, COUNT(*) AS cnt, SUM(amount) AS total
FROM ext_hive_db.orders
GROUP BY status;
-- 分区裁剪:WHERE条件中包含分区列时,引擎自动跳过不相关分区目录
SELECT * FROM ext_hive_db.events WHERE dt = '2026-06-11';
SELECT dt, COUNT(*) AS cnt
FROM ext_hive_db.events
WHERE dt >= '2026-06-01' AND dt < '2026-07-01'
GROUP BY dt;JOIN查询
-- 外表与外表JOIN
SELECT o.order_id, o.amount, e.event_type
FROM ext_hive_db.orders o
JOIN ext_hive_db.events e ON o.order_id = e.event_id
WHERE e.dt = '2026-06-11';
-- 外表与内表JOIN
SELECT e.order_id, e.amount, u.user_name
FROM ext_hive_db.orders e
JOIN internal_db.users u ON e.user_id = u.user_id;
-- 自JOIN
SELECT a.order_id, a.status, b.order_id AS related_id
FROM ext_hive_db.orders a
INNER JOIN ext_hive_db.orders b ON a.user_id = b.user_id
WHERE a.order_id != b.order_id;UNION查询
-- 合并多个外表的数据
SELECT order_id, amount, status FROM ext_hive_db.orders_2025
UNION ALL
SELECT order_id, amount, status FROM ext_hive_db.orders_2026
ORDER BY order_id;谓词下推
Parquet和ORC格式支持谓词下推,引擎利用文件内部的统计信息(min/max/null count)跳过不满足条件的数据块,减少I/O扫描量。TEXTFILE和JSON格式不支持谓词下推,查询时为全表扫描。
视图
支持基于Hive外表创建视图,可用于简化复杂查询、封装业务逻辑。
基本视图
-- 创建视图
CREATE VIEW ext_hive_db.paid_orders AS
SELECT order_id, user_id, amount
FROM ext_hive_db.orders
WHERE status = 'paid';
-- 查询视图
SELECT * FROM ext_hive_db.paid_orders WHERE amount > 100;
-- 删除视图
DROP VIEW IF EXISTS ext_hive_db.paid_orders;嵌套视图
-- 视图引用视图
CREATE VIEW ext_hive_db.base_view AS
SELECT * FROM ext_hive_db.orders;
CREATE VIEW ext_hive_db.union_view AS
SELECT * FROM ext_hive_db.base_view
UNION ALL
SELECT * FROM ext_hive_db.orders;
SELECT COUNT(*) FROM ext_hive_db.union_view;CTE(公共表表达式)
WITH order_summary AS (
SELECT dt, COUNT(*) AS cnt, SUM(amount) AS total
FROM ext_hive_db.events
GROUP BY dt
)
SELECT * FROM order_summary WHERE total > 10000;分区管理
功能概览
操作 | 说明 |
| 建表时定义分区列。 支持多级分区,例如 |
| 从OSS目录结构自动发现并注册分区。 |
| 指定子目录进行增量分区修复。 |
| 删除指定分区(仅删元数据,不删OSS文件)。 |
| 查看已注册的分区列表。 |
分区目录结构要求
OSS上的目录结构必须遵循Hive风格key=value/命名。分区列的值从目录名推导,数据文件中不包含分区列。
oss://<bucket>/data/orders/
├── dt=20260527/
│ ├── region=1/
│ │ └── data.parquet
│ └── region=2/
│ └── data.parquet
└── dt=20260528/
└── region=1/
└── data.parquet对应建表语句:
CREATE EXTERNAL TABLE ext_db.orders (id INT, name VARCHAR(100))
PARTITIONED BY (dt STRING, region INT)
STORED AS PARQUET
LOCATION 'oss://<bucket>/data/orders/';分区发现(MSCK REPAIR TABLE)
分区表创建后,需执行MSCK REPAIR TABLE扫描OSS目录结构,自动发现并注册符合key=value/命名规范的分区:
-- 全表分区修复
MSCK REPAIR TABLE ext_hive_db.events;
-- 指定子目录增量修复(分区数量多时推荐)
MSCK REPAIR TABLE ext_hive_db.events sync_dir 'oss://<YOUR-BUCKET>/warehouse/ext_hive_db/events/dt=2026-06-11/';外部引擎写入新分区数据后,也需要重新执行MSCK REPAIR TABLE使新分区元数据可见。分区数量极多时可能耗时较长,建议使用sync_dir增量修复或分区投影(Partition Projection)。
删除和查看分区
-- 查看已注册的分区(单级分区表)
SHOW PARTITIONS ext_hive_db.events;
-- 查看已注册的分区(多级分区表)
SHOW PARTITIONS ext_hive_db.events_multi;
-- 删除单级分区(仅删除元数据,不删除OSS文件)
ALTER TABLE ext_hive_db.events DROP PARTITION (dt = '2026-06-11');
-- 删除多级分区
ALTER TABLE ext_hive_db.events_multi DROP PARTITION (dt = '20260527', region = 1);
-- 删除后可通过MSCK REPAIR恢复(如果OSS上文件仍在)
MSCK REPAIR TABLE ext_hive_db.events;DROP PARTITION指定的分区列名必须与建表时定义的分区列名匹配。若开启INTERCEPT_DROP_NOT_EXIST_PARTITION_COLUMN配置,列名不匹配时会拦截并报错。
分区投影(Partition Projection)
分区投影允许在TBLPROPERTIES中定义分区的生成规则,引擎无需执行MSCK REPAIR TABLE即可自动推导分区列表。适用于分区数量多的场景。
启用分区投影
要启用分区投影,需在建表语句的TBLPROPERTIES中完成以下设置:
设置
'projection.enabled' = 'true'启用分区投影(必需)。通过
'projection.<分区列名>.type' = '<类型>'指定各分区列的投影类型。根据投影类型,设置对应的参数(如
values、range、miss等)。
投影类型
类型 | 说明 | 参数 |
| 从文件系统目录列举分区。 |
|
| 枚举所有可能的分区值。 |
|
| 指定分区值的整数范围。 |
|
示例
injected(文件系统列举)
无需MSCK REPAIR,引擎自动从OSS目录发现分区。适用于分区数量多且无规律的场景。
CREATE EXTERNAL TABLE ext_hive_db.fs_projected (
a INT,
b INT
)
PARTITIONED BY (c INT, d INT)
STORED AS PARQUET
LOCATION 'oss://<YOUR-BUCKET>/data/fs_projected/'
TBLPROPERTIES (
'projection.enabled' = 'true',
'projection.c.type' = 'injected',
'projection.c.miss' = 'LIST',
'projection.d.type' = 'injected',
'projection.d.miss' = 'LIST'
);enum(枚举)
预先枚举所有可能的分区值,无需扫描目录,分区发现最快。适用于分区值已知且固定的场景。
CREATE EXTERNAL TABLE ext_hive_db.enum_only (
a INT,
b INT
)
PARTITIONED BY (region INT)
STORED AS PARQUET
LOCATION 'oss://<YOUR-BUCKET>/data/enum_only/'
TBLPROPERTIES (
'projection.enabled' = 'true',
'projection.region.type' = 'enum',
'projection.region.values' = '1,2,3,4'
);混合投影(enum + injected)
同一张表的不同分区列可使用不同的投影类型。以下示例中,c使用enum枚举所有可能的值,d使用injected从文件系统目录列举。
CREATE EXTERNAL TABLE ext_hive_db.mixed_projected (
a INT,
b INT
)
PARTITIONED BY (c INT, d INT)
STORED AS PARQUET
LOCATION 'oss://<YOUR-BUCKET>/data/mixed_projected/'
TBLPROPERTIES (
'projection.enabled' = 'true',
'projection.c.type' = 'enum',
'projection.c.values' = '1,2',
'projection.d.type' = 'injected',
'projection.d.miss' = 'LIST'
);使用建议
场景 | 推荐方式 |
分区数量少(< 100) | 使用MSCK REPAIR TABLE即可 |
分区数量多且有规律 | 使用enum或integer投影 |
分区数量多且无规律 | 使用injected(文件系统列举) |
需要最快分区发现 | 使用enum/integer(无需扫描目录) |
统计信息(ANALYZE TABLE)
支持对Hive外表收集统计信息,帮助查询优化器选择更优的执行计划(如JOIN策略)。
功能概览
操作 | 支持状态 |
| 支持 |
| 支持 |
| 支持 |
| 支持 |
| 支持 |
写入时自动收集统计信息 | 支持(可配置) |
实时统计信息(RT Collect) | 支持 |
语法
-- 收集表级统计信息
ANALYZE TABLE <table_name>;
-- 收集指定列的基本统计信息(NDV、NULL比率、min/max等)
ANALYZE TABLE <table_name> UPDATE BASIC ON `<col1>`, `<col2>`;
-- 收集指定列的采样统计信息
ANALYZE TABLE <table_name> UPDATE SAMPLED_BASIC ON `<col1>`;
-- 收集指定列的直方图
ANALYZE TABLE <table_name> UPDATE HISTOGRAM ON `<col1>`, `<col2>`;
-- 仅分析指定分区的统计信息
ANALYZE TABLE <table_name> WITH PARTITIONS = ARRAY[ARRAY['<part_val1>', <part_val2>]];示例
-- 收集全局统计信息
ANALYZE TABLE ext_hive_db.orders;
-- 收集id和amount列的基本统计
ANALYZE TABLE ext_hive_db.orders UPDATE BASIC ON `order_id`, `amount`;
-- 收集amount列的直方图
ANALYZE TABLE ext_hive_db.orders UPDATE HISTOGRAM ON `amount`;性能与最佳实践
文件格式选择
场景 | 推荐格式 | 理由 |
分析型查询为主 | Parquet | 列式存储、高压缩比、谓词下推 |
Hive生态互通 | ORC | Hive原生格式、良好的读取性能 |
文本数据导入 | TextFile | 兼容CSV/TSV |
JSON日志 | JSON | 无需转换即可查询 |
分区设计
原则 | 说明 |
选择高频过滤列 | WHERE条件中最常出现的列适合做分区。 |
避免高基数分区 | 分区数不宜超过数万,否则MSCK REPAIR TABLE和查询planning都会变慢。 |
时间列优先 | 日期列( |
多级分区按粒度递减 | 如 |
写入优化
建议 | 说明 |
批量写入 | 一次INSERT写入大批量数据,避免频繁小文件写入。理想文件大小128MB ~ 512MB。 |
使用INSERT OVERWRITE | 全量覆写场景比先删再写更高效。 |
压缩写入 | 配合SNAPPY/ZSTD压缩,减少存储和I/O开销。 |
避免小文件 | 小文件过多会导致查询planning时间增加和I/O请求数过多。如已产生大量小文件,可通过外部引擎(Spark)合并后重新写入,或将热数据导入AnalyticDB内表加速查询。 |
查询优化
建议 | 说明 |
带分区条件 | WHERE中包含分区列可跳过不相关分区目录。 |
列裁剪 | 避免 |
统计信息 | 定期执行ANALYZE TABLE,帮助优化器选择更好的JOIN策略。 |
分区投影 | 大量分区时使用Partition Projection避免MSCK REPAIR开销。 |
使用限制
DDL限制
操作 | 限制说明 |
ALTER TABLE ADD COLUMNS | 支持。添加列后,已有数据行中新列返回NULL,新写入的数据行返回实际值。 |
ALTER TABLE RENAME | 支持。重命名后原表名不再可用。 |
ALTER TABLE DROP COLUMN | 不支持。 |
CREATE TABLE AS SELECT (CTAS) | 不支持。需先建表再INSERT。 |
PRIMARY KEY / 索引 | 不支持。 |
DML限制
操作 | 限制说明 |
UPDATE / DELETE / MERGE INTO | 不支持。 |
INSERT INTO ... VALUES | 部分场景不支持,建议使用 |
INSERT INTO ... PARTITION (dt='...') | 不支持。分区列需作为SELECT结果的最后几列进行动态分区写入。 |
INSERT写入文件格式 | 由建表时 |
INSERT OVERWRITE动态分区覆写 | 仅替换SELECT结果中出现的分区,其他分区数据不受影响。 |
写入后分区可见性 | 写入后可能需要 |
数据类型限制
AVRO格式不支持
TINYINT等类型。CHAR(N)部分场景存在兼容性问题,建议使用VARCHAR替代。STRUCT类型按名称匹配,表定义中的属性可以是底层文件struct属性的子集,不要求严格对齐。
分区限制
分区列不在数据文件中,分区值从目录名推导(如
dt=20260527/→ dt = '20260527')。不支持
ALTER TABLE ADD PARTITION手动添加分区,请使用MSCK REPAIR TABLE。分区目录结构必须遵循Hive风格
key=value/命名规范。DROP PARTITION指定的分区列名必须与建表时定义的分区列名匹配,否则:
若开启
INTERCEPT_DROP_NOT_EXIST_PARTITION_COLUMN配置,会拦截并报错;若未开启,可能误删或无效操作。
分区列支持的类型:STRING、INT、BIGINT、BOOLEAN、DATE等。
统计信息限制
不支持
ANALYZE TABLE ... FOR ALL COLUMNS语法。建议在大批量写入后执行ANALYZE TABLE更新统计信息。
增量写入场景下,写入时自动收集统计信息可通过配置开关
o_cbo_collect_stats_when_import控制。
查询限制
分区裁剪:WHERE条件中包含分区列时自动生效,无需Hint。
谓词下推:Parquet/ORC格式支持利用文件级min/max统计跳过不匹配的row group。
TextFile/JSON不支持谓词下推,全表扫描性能不如列式格式。
建议查询时带上分区条件,避免全表扫描大量OSS文件。
其他限制
DROP TABLE仅删除外部表定义,不删除OSS上的数据文件。SQL中不支持传入AK/SK,所有鉴权由实例级配置完成。
LOCATION指向的OSS路径必须已存在(Hive外表不会自动创建目录)。数据文件格式必须与建表时
STORED AS声明一致,否则查询报错。TEXTFILE和JSON格式不支持谓词下推,全表扫描性能不如Parquet和ORC。
跨Region访问OSS取决于实例级配置。
常见报错
报错 | 触发场景 | 处理方法 |
| OSS鉴权失败 | 联系管理员确认实例OSS授权。 |
| 表未创建或使用了错误的数据库 | 检查USE语句和表名是否正确。 |
| 对非分区表执行分区操作 | 确认建表时包含PARTITIONED BY子句。 |
MSCK REPAIR后COUNT为0 | OSS目录结构不符合Hive分区命名 | 检查目录是否遵循 |
| 分区列类型不匹配 | 确认INSERT数据中分区列的类型与建表定义一致。 |
| 数据文件格式与STORED AS不一致 | 确保OSS文件格式与建表声明一致。 |
| STRUCT属性名不匹配 | 确认struct子字段名与底层文件一致(按名匹配)。 |