Hive外表(XIHE SQL)

更新时间:
复制 MD 格式

AnalyticDB for MySQLXIHE引擎支持通过Hive外表方式直接读写存储在OSS上的Parquet、ORC、CSV、JSONRCFile格式数据文件。您可以通过标准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>',
    ...
)];

子句

必填

说明

STORED AS <FORMAT>

数据文件格式:PARQUETORCTEXTFILEJSONRCFILE

详见下方存储格式

LOCATION

OSS数据文件存储路径。仅支持oss://协议,格式为oss://<bucket>/<path>/,建议以/结尾。路径必须已存在,不同外表不应指向同一OSS目录。

PARTITIONED BY (...)

Hive风格的分区列定义。分区目录需遵循key=value/命名规范。

ROW FORMAT ...

指定行格式。支持三种语法,详见下方ROW FORMAT。仅TEXTFILE格式需要。

TBLPROPERTIES

表属性。可设置compress_type(压缩算法,详见下方压缩类型)和skip_header_line_count(跳过CSV头部行数)等。

存储格式

格式

关键字

说明

适用场景

Parquet

STORED AS PARQUET

列式存储,高压缩比,支持谓词下推

分析型查询(推荐)

ORC

STORED AS ORC

列式存储,Hive生态常用格式

Hive生态互通

TextFile

STORED AS TEXTFILE

文本格式,支持自定义分隔符

CSV/TSV文本数据

JSON

STORED AS JSON

JSON Lines格式

日志数据

RCFile

STORED AS RCFILE

行列混合存储

兼容旧Hive数据

压缩类型

通过TBLPROPERTIES指定写入时的压缩算法:

TBLPROPERTIES ('compress_type' = 'SNAPPY')

压缩类型

说明

UNCOMPRESSED

不压缩

SNAPPY

快速压缩/解压(推荐)

GZIP

高压缩比

ZSTD

高压缩比+快速解压

LZ4

极速压缩/解压

ROW FORMAT

TEXTFILE格式支持以下三种行格式定义方式:

语法

说明

ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

指定字段分隔符(逗号、制表符等)

ROW FORMAT SERDE '<serde_class>'

指定自定义SerDe类,如org.apache.hadoop.hive.serde2.OpenCSVSerde

WITH SERDEPROPERTIES (...)

设置SerDe属性,如'separatorChar'=','

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

布尔

boolean

TINYINT / SMALLINT

1/2字节整数

tinyint / smallint

INT / BIGINT

4/8字节整数

int / bigint

FLOAT / DOUBLE

单/双精度浮点

float / double

DECIMAL(p, s)

定点数

decimal

VARCHAR / STRING

变长字符串

string / varchar

DATE / TIMESTAMP

日期/时间戳

date / timestamp

BINARY

二进制

binary

ARRAY<T> / MAP<K,V> / STRUCT<...>

复杂类型

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;

谓词下推

ParquetORC格式支持谓词下推,引擎利用文件内部的统计信息(min/max/null count)跳过不满足条件的数据块,减少I/O扫描量。TEXTFILEJSON格式不支持谓词下推,查询时为全表扫描。

视图

支持基于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;

分区管理

功能概览

操作

说明

PARTITIONED BY (...)

建表时定义分区列。

支持多级分区,例如PARTITIONED BY (dt STRING, region INT)

MSCK REPAIR TABLE

OSS目录结构自动发现并注册分区。

MSCK REPAIR TABLE ... sync_dir

指定子目录进行增量分区修复。

ALTER TABLE DROP PARTITION

删除指定分区(仅删元数据,不删OSS文件)。

SHOW PARTITIONS

查看已注册的分区列表。

分区目录结构要求

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' = '<类型>'指定各分区列的投影类型。

  • 根据投影类型,设置对应的参数(如valuesrangemiss等)。

投影类型

类型

说明

参数

injected

从文件系统目录列举分区。

projection.<col>.miss = 'LIST'

enum

枚举所有可能的分区值。

projection.<col>.values = '1,2,3'

integer

指定分区值的整数范围。

projection.<col>.range = '<min>,<max>'

示例

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即可

分区数量多且有规律

使用enuminteger投影

分区数量多且无规律

使用injected(文件系统列举)

需要最快分区发现

使用enum/integer(无需扫描目录)

统计信息(ANALYZE TABLE)

支持对Hive外表收集统计信息,帮助查询优化器选择更优的执行计划(如JOIN策略)。

功能概览

操作

支持状态

ANALYZE TABLE

支持

ANALYZE TABLE UPDATE BASIC ON <cols>

支持

ANALYZE TABLE UPDATE SAMPLED_BASIC ON <cols>

支持

ANALYZE TABLE UPDATE HISTOGRAM ON <cols>

支持

ANALYZE TABLE ... WITH PARTITIONS

支持

写入时自动收集统计信息

支持(可配置)

实时统计信息(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都会变慢。

时间列优先

日期列(dt STRING)是最常见的分区选择。

多级分区按粒度递减

PARTITIONED BY (dt STRING, hour INT)

写入优化

建议

说明

批量写入

一次INSERT写入大批量数据,避免频繁小文件写入。理想文件大小128MB ~ 512MB。

使用INSERT OVERWRITE

全量覆写场景比先删再写更高效。

压缩写入

配合SNAPPY/ZSTD压缩,减少存储和I/O开销。

避免小文件

小文件过多会导致查询planning时间增加和I/O请求数过多。如已产生大量小文件,可通过外部引擎(Spark)合并后重新写入,或将热数据导入AnalyticDB内表加速查询。

查询优化

建议

说明

带分区条件

WHERE中包含分区列可跳过不相关分区目录。

列裁剪

避免SELECT *,只查需要的列(Parquet/ORC列式优势)。

统计信息

定期执行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 ... SELECT * FROM VALUES ROW(...)语法。

INSERT INTO ... PARTITION (dt='...')

不支持。分区列需作为SELECT结果的最后几列进行动态分区写入。

INSERT写入文件格式

由建表时STORED AS决定,写入后在OSS生成对应格式文件。

INSERT OVERWRITE动态分区覆写

仅替换SELECT结果中出现的分区,其他分区数据不受影响。

写入后分区可见性

写入后可能需要MSCK REPAIR TABLE让新分区元数据可见。

数据类型限制

  • 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声明一致,否则查询报错。

  • TEXTFILEJSON格式不支持谓词下推,全表扫描性能不如ParquetORC。

  • Region访问OSS取决于实例级配置。

常见报错

报错

触发场景

处理方法

Access Denied / OSS 403

OSS鉴权失败

联系管理员确认实例OSS授权。

Table does not exist

表未创建或使用了错误的数据库

检查USE语句和表名是否正确。

no partition columns defined

对非分区表执行分区操作

确认建表时包含PARTITIONED BY子句。

MSCK REPAIRCOUNT0

OSS目录结构不符合Hive分区命名

检查目录是否遵循key=value/格式。

Invalid column type for partition

分区列类型不匹配

确认INSERT数据中分区列的类型与建表定义一致。

File format mismatch

数据文件格式与STORED AS不一致

确保OSS文件格式与建表声明一致。

Cannot read struct field

STRUCT属性名不匹配

确认struct子字段名与底层文件一致(按名匹配)。