Hive中能否通过SELECT查询表字段属性?查询information_schema时报错
Hive 元数据SELECT查询实现说明
核心结论
Hive 原生不支持直接查询information_schema.COLUMNS系统表,这是你执行原语句报错的根本原因——Hive的系统元数据设计和MySQL等传统关系型数据库存在明显差异,无法直接复用传统SQL的元数据查询语法。
可用实现方案
方案1:通用内置元数据命令(所有Hive版本可用)
该方式无分布式计算开销,直接从元数据存储拉取信息,是最便捷的查询方式:
- 快速提取指定表的字段名、字段类型、字段注释:
返回结果的字段结构和你期望的-- 注意核对库表对应关系,避免库名写错 DESCRIBE gfr_staging.spt_myr;Field、Type输出完全匹配。 - 如果需要查看全维度表元信息(包括存储位置、存储格式、分区规则、自定义表属性),可使用格式化输出命令:
DESCRIBE FORMATTED gfr_staging.spt_myr;
方案2:Hive 2.3+ 版本原生元数据表查询
Hive 2.3及以上版本内置了元数据虚拟库sys,支持通过标准SELECT语句查询各类元数据,对应需求的查询写法为:
SELECT column_name AS `Field`, type_name AS `Type` FROM sys.columns WHERE db_name = 'gfr_staging' AND table_name = 'spt_myr';
注意:你原查询的
WHERE条件中写的库名为gfr_standard,但实际目标表所在库是gfr_staging,即使语法适配,库名不匹配也会返回空结果,需要提前核对。
方案3:低版本Hive适配(无sys元数据库场景)
如果Hive版本低于2.3,没有内置sys系统元数据表,可以通过临时表中转的方式,将元数据转为可SELECT查询的结果:
- 执行元数据查询,将结果写入临时表:
CREATE TEMPORARY TABLE temp_spt_myr_meta ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' AS DESCRIBE gfr_staging.spt_myr; - 像普通数据表一样执行SELECT查询提取字段信息:
SELECT col_name AS `Field`, data_type AS `Type` FROM temp_spt_myr_meta -- 过滤DESCRIBE结果中自带的分隔标记行 WHERE col_name NOT LIKE '#%' AND col_name != '';
常见报错原因
原语句执行报错通常有两类典型表现:
- 提示
Database information_schema not found:Hive默认不存在information_schema库,无法识别对应查询逻辑 - 提示表/字段不存在:即使部分版本做了语法兼容,
COLUMNS表的字段定义、表结构也和MySQL版本不匹配,无法直接复用查询写法
内容的提问来源于stack exchange,提问作者Farid Arshad
相关产品推荐
相关产品推荐

