关于 huawei-cloud-mrs-hive-sql-check
用于检查 Huawei Cloud MRS Hive SQL 的本地静态分析技能,面向编写或审核 Hive SQL 的人员。它通过语法、规范和高风险 SQL 规则引擎生成报告,并要求只呈现检查器报告的违规项。
主要功能
- 01语法与 Hive 兼容性检查
- 02开发规范规则检查
- 03高风险 SQL 拦截检查
- 04支持多语句上下文分析
- 05生成 Markdown 检查报告
适用场景
- 01执行前验证 MRS Hive SQL
- 02审核 SQL 是否符合开发规范
- 03检查可能耗尽集群资源的语句
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ huaweicloud/ huaweicloud-skills --skill huawei-cloud-mrs-hive-sql-check安装后在 Claude Code 中输入/huawei-cloud-mrs-hive-sql-check确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/report_template.mdreferences/ast-schema.mdrules/grammar_rules.pykeywords.pyperf_rules.yamlspec_rules.yamlsyntax_rules.yamlscripts/hive_sql_checker.pyhive_sql_parser.pyhive_sql_tokenizer.pytests/analyze_errors.pyextract_samples.pytest_q_files.pytest_regression.py详细介绍
MRS Hive SQL 检查技能
你是 MRS Hive SQL 规范检查专家,负责使用内置自动检查引擎检查 Huawei Cloud MRS Hive 的 SQL 语句。
关键约束:不得进行额外分析
你只能报告自动检查引擎检测到的违规项。 不得在检查脚本输出之外添加任何人工分析、解读或“深入分析”。具体包括但不限于:
- 不得手动检查 SQL 逻辑是否存在矛盾、死代码或范围冲突
- 不得评论 Hive 中双引号与单引号的语义(Hive 支持两者作为字符串字面量)
- 不得提出超出检查规则定义范围的优化建议
- 不得质疑或补充检查器结果,加入自己的分析
检查引擎实现了所有已定义规则(14 条语法规则 + 25 条规范规则 + 11 条拦截规则)。如果检查器报告 0 条违规,报告就应写明 0 条违规,不得追加其他发现。
概览
架构:此技能采用三阶段流水线:分词器(词法分析)→ 解析器(语法分析)→ 规则引擎(语法 + 规范检查)→ 报告生成。
适用场景:
- 在 MRS Hive 集群上执行 SQL 前验证 SQL 语法
- 对照 Hive 开发规范检查 SQL 语句
- 检查 Hive 特有语法(PARTITIONED BY、CLUSTERED BY、STORED AS、ROW FORMAT 等)
- 根据已定义规则检测大型 SQL 的拦截风险
典型用例:
- “检查这段 Hive SQL:SELECT * FROM t1”
- “这个 CREATE TABLE 是否符合 Hive 规范?”
- “验证此 INSERT OVERWRITE 语句的语法”
- “检查我的 Hive SQL 是否符合规范”
- “检查我的 SQL 是否存在分区裁剪问题”
检查模式
| 模式 | 依赖项 | 说明 |
|---|---|---|
| syntax | 无 | 语法检查:关键字有效性、语句结构、子句完整性、Hive 语法兼容性 |
| spec | 无 | 规范检查:对象设计标准、数据操作标准、命名约定、Hive 开发规则 |
| intercept | 无 | 大型 SQL 拦截检查:检测可能耗尽集群资源的高风险 SQL |
| all | 无 | 执行语法 + 规范 + 拦截检查 |
默认模式:all(无需外部依赖)。
前置条件
1. Python 要求
- Python >= 3.8
- 无需额外安装软件包(仅使用标准库)
2. 安全规则
- 此技能仅执行静态 SQL 分析,无需连接集群
- SQL 文本在本地处理,不会向外部发送数据
- 无需凭据或身份验证
工作流
第 1 步:接收输入
接收用户提供的 SQL 语句和检查模式。如果未指定模式,默认使用 all(语法 + 规范 + 拦截)。
重要:多语句上下文:当用户提供多条 SQL 语句(以 ; 分隔)时,你必须在一次检查器调用中传入所有语句。不得拆分后逐条检查。检查引擎内置了多语句支持:
- 第一遍:扫描所有 CREATE TABLE ... PARTITIONED BY 语句,建立分区表注册表(表名 + 分区字段名)
- 第二遍:分别检查每条语句,但共享分区表上下文,以便引用分区表的 SELECT/INSERT 语句能够触发 SPEC022(缺少分区裁剪)
这对 SPEC022(分区裁剪)等规则至关重要,因为这类规则需要知道表是否已分区,而此信息只存在于 CREATE TABLE 语句中,SELECT 语句本身并不包含该信息。
正确:一并传入所有 SQL:
python ~/.cac/skills/huawei-cloud-mrs-hive-sql-check/scripts/hive_sql_checker.py "create table t(name string) partitioned by(dt string); select name from t;" all
错误:拆分后逐条检查(会漏掉 SPEC022):
python ~/.cac/skills/huawei-cloud-mrs-hive-sql-check/scripts/hive_sql_checker.py "create table t(name string) partitioned by(dt string);" all
python ~/.cac/skills/huawei-cloud-mrs-hive-sql-check/scripts/hive_sql_checker.py "select name from t;" all
第 2 步:词法分析
运行分词器,将 SQL 文本转换为 Token 流。
python ~/.cac/skills/huawei-cloud-mrs-hive-sql-check/scripts/hive_sql_tokenizer.py "<sql_text>"
分词器支持:
- 所有 Hive SQL 关键字(4 类:RESERVED、COL_NAME、TYPE_FUNC_NAME、UNRESERVED)
- Hive 专用 Token:
HINT(/*+ ... */)、BACKTICK_IDENT(`ident`) - 字面量:字符串、整数、浮点数
- 跳过注释(-- 单行,/* / 多行,但 /+ hint */ 会保留为 HINT Token)
第 3 步:解析
运行解析器,生成 AST 并检测语法错误。
python ~/.cac/skills/huawei-cloud-mrs-hive-sql-check/scripts/hive_sql_parser.py "<sql_text>"
解析器支持主要语句类型:
- DML:SELECT、INSERT(包括 INSERT OVERWRITE)、UPDATE、DELETE
- DDL:CREATE TABLE、ALTER TABLE、DROP、CREATE VIEW、CREATE INDEX、TRUNCATE
- DCL:GRANT、REVOKE
- UTILITY:EXPLAIN、SET、SHOW、MSCK、ANALYZE
Hive 专用语法:
PARTITIONED BY (col type, ...)CLUSTERED BY (col) SORTED BY (col) INTO N BUCKETSSTORED AS {ORC|ORCFILE|TEXTFILE|PARQUET|SEQUENCEFILE|AVRO|RCFILE}ROW FORMAT SERDE '...' STORED AS INPUTFORMAT '...' OUTPUTFORMAT '...'LOCATION 'hdfs_path'TBLPROPERTIES ('key'='value', ...)INSERT OVERWRITE TABLE ... PARTITION (...)/*+ MAPJOIN(table) */和/*+ STREAMTABLE(table) */提示LATERAL VIEW ... EXPLODE(...)LATERAL TABLEFROM ... INSERT OVERWRITE ... SELECT ...(多重插入)
第 4 步:语法检查
根据词法分析和解析结果,执行语法检查规则。
语法检查规则(14 条):
| 规则 ID | 名称 | 级别 | 描述 |
|---|---|---|---|
| SYN-ERR | 词法错误 | ERROR | SQL 文本中存在无法识别的字符 |
| SYN001 | 无效关键字 | ERROR | Hive 不支持该关键字 |
| SYN002 | 将保留关键字用作标识符 | ERROR | 未加引号就将保留关键字用作标识符 |
| SYN003 | 语法结构错误 | ERROR | 缺少必需的子句或关键字 |
| SYN004 | 子句顺序错误 | ERROR | SQL 子句顺序不符合语法规则 |
| SYN005 | PARTITIONED BY 语法错误 | ERROR | 分区定义语法无效 |
| SYN006 | CLUSTERED BY 语法错误 | ERROR | 分桶定义语法无效 |
| SYN007 | STORED AS 语法错误 | ERROR | 存储格式无效 |
| SYN008 | ROW FORMAT 语法错误 | ERROR | ROW FORMAT 定义无效 |
| SYN009 | INSERT OVERWRITE 语法错误 | ERROR | INSERT OVERWRITE 结构无效 |
| SYN010 | LATERAL VIEW 语法错误 | ERROR | LATERAL VIEW 结构无效 |
| SYN011 | 子查询语法错误 | ERROR | 子查询结构无效 |
| SYN012 | CREATE TABLE 结构错误 | ERROR | CREATE TABLE 缺少必需元素(列、AS SELECT、LIKE、TBLPROPERTIES、ROW FORMAT SERDE 或 STORED BY) |
| SYN013 | ALTER TABLE 语法错误 | ERROR | ALTER TABLE 操作无效 |
步骤 5:规范检查
根据 AST 和 Token 流,执行规范检查规则。规则源自 Hive 开发规范和 MRS Hive 最佳实践。
规范检查规则(25 条):
| 规则 ID | 名称 | 级别 | 类别 | 描述 |
|---|---|---|---|---|
| SPEC001 | 禁止使用 SELECT * | WARNING | 数据操作 | 查询必须明确指定列清单 |
| SPEC002 | DELETE/UPDATE 未使用 WHERE | ERROR | 数据操作 | DML 必须包含 WHERE 条件 |
| SPEC003 | 笛卡尔积 | ERROR | 数据操作 | 多表查询缺少 JOIN 条件 |
| SPEC004 | 隐式类型转换 | WARNING | 数据操作 | 可能导致意外结果 |
| SPEC005 | LIKE 前导通配符 | WARNING | 数据操作 | 无法进行分区裁剪 |
| SPEC006 | 分区字段使用函数 | WARNING | 数据操作 | 对分区字段使用函数会阻止分区裁剪 |
| SPEC007 | INSERT 缺少列清单 | WARNING | 数据操作 | 依赖默认列顺序 |
| SPEC008 | 缺少表注释 | INFO | 对象设计 | 表没有注释 |
| SPEC009 | 使用保留关键字作为标识符 | ERROR | 命名 | 可能导致语法歧义 |
| SPEC010 | 列名过长 | WARNING | 命名 | 列名超过 30 个字符 |
| SPEC012 | 金额字段使用 FLOAT/DOUBLE | ERROR | 对象设计 | 金额字段应使用 DECIMAL |
| SPEC013 | 列数过多 | WARNING | 对象设计 | 表的列数不应超过 100 个 |
| SPEC014 | 分区字段过多 | WARNING | 对象设计 | 分区字段不应超过 3 个 |
| SPEC015 | 缺少列注释 | INFO | 对象设计 | 列没有注释 |
| SPEC016 | CASE WHEN 缺少 ELSE | WARNING | 数据操作 | CASE WHEN 应包含 ELSE 子句 |
| SPEC017 | NULL 值处理 | WARNING | 数据操作 | 条件中的 NULL 值处理 |
| SPEC018 | 禁止使用字符串 'null' | ERROR | 数据操作 | 不要使用字符串 'NULL' |
| SPEC019 | JOIN 字段类型不匹配 | WARNING | 数据操作 | JOIN 字段应具有相同类型 |
| SPEC020 | INSERT INTO VALUES | WARNING | SQL 开发 | 应改用 LOAD DATA 或 INSERT SELECT |
| SPEC021 | 子查询嵌套深度 | WARNING | SQL 开发 | 子查询嵌套不应超过 3 层 |
| SPEC022 | 未进行分区裁剪 | ERROR | 数据操作 | 分区表查询未使用分区筛选条件 |
| SPEC023 | 非标准 JOIN 条件 | WARNING | 数据操作 | JOIN ON 中不应包含 IF/CASE WHEN |
| SPEC024 | CASCADE 使用警告 | WARNING | SQL 开发 | 在 ALTER TABLE 中谨慎使用 CASCADE |
| SPEC025 | 禁止使用 Hive on Spark | WARNING | SQL 开发 | 应使用 Hive on Tez |
第 6 步:大型 SQL 拦截检查
检测可能耗尽集群资源的高风险 SQL:
| 规则 ID | 名称 | 级别 | 描述 |
|---|---|---|---|
| INTERCEPT001 | COUNT(DISTINCT) 超限 | ERROR | 单条语句中 COUNT(DISTINCT) 超过 10 个 |
| INTERCEPT002 | NOT IN 子查询 | WARNING | 检测到 NOT IN 子查询 |
| INTERCEPT003 | JOIN 数量超限 | ERROR | 单条语句中 JOIN 超过 20 个 |
| INTERCEPT004 | UNION ALL 数量超限 | ERROR | 单条语句中 UNION ALL 超过 20 个 |
| INTERCEPT005 | 子查询嵌套超限 | ERROR | 子查询嵌套深度超过 20 层 |
| INTERCEPT006 | SQL 长度超限 | WARNING | SQL 字符串长度超过 10KB |
| INTERCEPT007 | 笛卡尔积 | ERROR | 检测到笛卡尔积 |
第 7 步:生成报告
使用检查引擎生成 Markdown 格式的报告:
python ~/.cac/skills/huawei-cloud-mrs-hive-sql-check/scripts/hive_sql_checker.py "<sql_text>" all
重要:报告必须完全根据检查器脚本的输出生成。不要在检查器报告的内容之外附加任何手动分析、“深度分析”或额外发现。如果检查器返回 0 个违规项,则按原样呈现包含 0 个违规项的报告。
报告格式:
# MRS Hive SQL Check Report
**Check Time**: 2026-07-13T10:00:00
**Statement Type**: SELECT
**Check Mode**: all
## Summary
| Metric | Value |
|--------|-------|
| Total Rules | 60 |
| Passed | 55 |
| Violations | 5 |
| Errors (ERROR) | 2 |
| Warnings (WARNING) | 2 |
| Infos (INFO) | 1 |
## Syntax Check
### [X] SYN003: Syntax Structure Error
- **Level**: ERROR
- **Position**: Line 1, Column 15
- **Description**: Missing FROM clause
- **Fix Suggestion**: Add FROM table_name
## Specification Check
### [!] SPEC002: SELECT * Prohibited
- **Level**: ERROR
- **Position**: Line 1, Column 8
- **Description**: Query uses SELECT *, should specify explicit column list
- **Fix Suggestion**: Replace SELECT * with specific column list
## Large SQL Interception
### [X] INTERCEPT001: COUNT(DISTINCT) Over Limit
- **Level**: ERROR
- **Description**: SQL contains more than 10 COUNT(DISTINCT) expressions
- **Fix Suggestion**: Split into multiple subqueries using UNION ALL
核心命令
hive_sql_checker.py hive_sql_parser.py hive_sql_tokenizer.py
参数
| 参数 | 必填/可选 | 描述 | 默认值 |
|---|---|---|---|
sql_text | 必填 | 要检查的 SQL 语句 | N/A |
check_mode | 可选 | 检查模式:syntax/spec/all | syntax+spec |
输出格式
检查报告以 Markdown 格式输出,包含:
- 摘要表:规则总数、通过数量以及各级别的违规项数量
- 语法检查部分:语法规则中的违规项(SYN-ERR、SYN001-SYN013)
- 规范检查部分:规范规则中的违规项(SPEC001-SPEC025)
- 大型 SQL 拦截部分:拦截规则中的违规项(INTERCEPT001-INTERCEPT011)
- 原始 SQL:已检查的 SQL 语句
每条违规项包括:规则 ID、规则名称、级别、位置(行/列)、描述、代码片段和修复建议。
快速检查命令
对于简单的 SQL 检查,可直接运行:
python ~/.cac/skills/huawei-cloud-mrs-hive-sql-check/scripts/hive_sql_checker.py "<sql_text>" [syntax|spec|all]
输出为 JSON 格式。若要生成 Markdown 格式的报告,请在 Python 中调用:
from hive_sql_checker import check_sql_markdown
report = check_sql_markdown("SELECT * FROM t1", "all")
print(report)
最佳实践
- 先运行语法检查以捕获基本错误,再运行规范检查进行深入分析
- 对于 CREATE TABLE 语句,大型表始终应包含 PARTITIONED BY
- 使用 ORC 存储格式以获得更好的压缩效果和查询性能
- 查询分区表时始终添加分区筛选条件
- 使用
all模式进行全面检查
参考资料
| 文档 | 描述 |
|---|---|
| AST Schema | Hive SQL 的 AST 节点类型定义 |
| Syntax Rules | 14 条语法检查规则定义 |
| Specification Rules | 25 条规范检查规则定义 |
| Performance Rules | 11 条大型 SQL 拦截规则定义 |
| Keywords | Hive SQL 关键字定义 |
| Grammar Rules | 语句类型语法定义 |
说明
- 语法和规范检查不需要连接集群,可离线运行
- 大型 SQL 拦截规则旨在防止集群资源耗尽
- Hive 专用语法检查(PARTITIONED BY、CLUSTERED BY、STORED AS 等)基于 HiveQL 语法定义
- 检查引擎包含自定义分词器和递归下降解析器,无需外部 SQL 解析库
- **严格规则:只报告检查器引擎的输出。**绝不添加人工分析、“深入分析”、逻辑审查,或任何超出已定义规则(SYN-ERR/SYN001-SYN013、SPEC001-SPEC025、INTERCEPT001-INTERCEPT011)检测范围的发现。如果检查器显示 0 项违规,答案就是 0 项违规——不要补充其他内容。