mcpField
H
huawei-cloud-mrs-hive-sql-check

huawei-cloud-mrs-hive-sql-check

github.com/huaweicloud测试与质量59126 次安装2 天前更新
代码仓库

关于 huawei-cloud-mrs-hive-sql-check

用于检查 Huawei Cloud MRS Hive SQL 的本地静态分析技能,面向编写或审核 Hive SQL 的人员。它通过语法、规范和高风险 SQL 规则引擎生成报告,并要求只呈现检查器报告的违规项。

主要功能

  1. 01语法与 Hive 兼容性检查
  2. 02开发规范规则检查
  3. 03高风险 SQL 拦截检查
  4. 04支持多语句上下文分析
  5. 05生成 Markdown 检查报告

适用场景

  1. 01执行前验证 MRS Hive SQL
  2. 02审核 SQL 是否符合开发规范
  3. 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.md
references/
ast-schema.md
rules/
grammar_rules.py
keywords.py
perf_rules.yaml
spec_rules.yaml
syntax_rules.yaml
scripts/
hive_sql_checker.py
hive_sql_parser.py
hive_sql_tokenizer.py
tests/
analyze_errors.py
extract_samples.py
test_q_files.py
test_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 语句(以 ; 分隔)时,你必须在一次检查器调用中传入所有语句。不得拆分后逐条检查。检查引擎内置了多语句支持:

  1. 第一遍:扫描所有 CREATE TABLE ... PARTITIONED BY 语句,建立分区表注册表(表名 + 分区字段名)
  2. 第二遍:分别检查每条语句,但共享分区表上下文,以便引用分区表的 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 BUCKETS
  • STORED 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 TABLE
  • FROM ... INSERT OVERWRITE ... SELECT ...(多重插入)
第 4 步:语法检查

根据词法分析和解析结果,执行语法检查规则。

语法检查规则(14 条):

规则 ID名称级别描述
SYN-ERR词法错误ERRORSQL 文本中存在无法识别的字符
SYN001无效关键字ERRORHive 不支持该关键字
SYN002将保留关键字用作标识符ERROR未加引号就将保留关键字用作标识符
SYN003语法结构错误ERROR缺少必需的子句或关键字
SYN004子句顺序错误ERRORSQL 子句顺序不符合语法规则
SYN005PARTITIONED BY 语法错误ERROR分区定义语法无效
SYN006CLUSTERED BY 语法错误ERROR分桶定义语法无效
SYN007STORED AS 语法错误ERROR存储格式无效
SYN008ROW FORMAT 语法错误ERRORROW FORMAT 定义无效
SYN009INSERT OVERWRITE 语法错误ERRORINSERT OVERWRITE 结构无效
SYN010LATERAL VIEW 语法错误ERRORLATERAL VIEW 结构无效
SYN011子查询语法错误ERROR子查询结构无效
SYN012CREATE TABLE 结构错误ERRORCREATE TABLE 缺少必需元素(列、AS SELECT、LIKE、TBLPROPERTIES、ROW FORMAT SERDE 或 STORED BY)
SYN013ALTER TABLE 语法错误ERRORALTER TABLE 操作无效
步骤 5:规范检查

根据 AST 和 Token 流,执行规范检查规则。规则源自 Hive 开发规范和 MRS Hive 最佳实践。

规范检查规则(25 条):

规则 ID名称级别类别描述
SPEC001禁止使用 SELECT *WARNING数据操作查询必须明确指定列清单
SPEC002DELETE/UPDATE 未使用 WHEREERROR数据操作DML 必须包含 WHERE 条件
SPEC003笛卡尔积ERROR数据操作多表查询缺少 JOIN 条件
SPEC004隐式类型转换WARNING数据操作可能导致意外结果
SPEC005LIKE 前导通配符WARNING数据操作无法进行分区裁剪
SPEC006分区字段使用函数WARNING数据操作对分区字段使用函数会阻止分区裁剪
SPEC007INSERT 缺少列清单WARNING数据操作依赖默认列顺序
SPEC008缺少表注释INFO对象设计表没有注释
SPEC009使用保留关键字作为标识符ERROR命名可能导致语法歧义
SPEC010列名过长WARNING命名列名超过 30 个字符
SPEC012金额字段使用 FLOAT/DOUBLEERROR对象设计金额字段应使用 DECIMAL
SPEC013列数过多WARNING对象设计表的列数不应超过 100 个
SPEC014分区字段过多WARNING对象设计分区字段不应超过 3 个
SPEC015缺少列注释INFO对象设计列没有注释
SPEC016CASE WHEN 缺少 ELSEWARNING数据操作CASE WHEN 应包含 ELSE 子句
SPEC017NULL 值处理WARNING数据操作条件中的 NULL 值处理
SPEC018禁止使用字符串 'null'ERROR数据操作不要使用字符串 'NULL'
SPEC019JOIN 字段类型不匹配WARNING数据操作JOIN 字段应具有相同类型
SPEC020INSERT INTO VALUESWARNINGSQL 开发应改用 LOAD DATA 或 INSERT SELECT
SPEC021子查询嵌套深度WARNINGSQL 开发子查询嵌套不应超过 3 层
SPEC022未进行分区裁剪ERROR数据操作分区表查询未使用分区筛选条件
SPEC023非标准 JOIN 条件WARNING数据操作JOIN ON 中不应包含 IF/CASE WHEN
SPEC024CASCADE 使用警告WARNINGSQL 开发在 ALTER TABLE 中谨慎使用 CASCADE
SPEC025禁止使用 Hive on SparkWARNINGSQL 开发应使用 Hive on Tez
第 6 步:大型 SQL 拦截检查

检测可能耗尽集群资源的高风险 SQL:

规则 ID名称级别描述
INTERCEPT001COUNT(DISTINCT) 超限ERROR单条语句中 COUNT(DISTINCT) 超过 10 个
INTERCEPT002NOT IN 子查询WARNING检测到 NOT IN 子查询
INTERCEPT003JOIN 数量超限ERROR单条语句中 JOIN 超过 20 个
INTERCEPT004UNION ALL 数量超限ERROR单条语句中 UNION ALL 超过 20 个
INTERCEPT005子查询嵌套超限ERROR子查询嵌套深度超过 20 层
INTERCEPT006SQL 长度超限WARNINGSQL 字符串长度超过 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/allsyntax+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)

最佳实践

  1. 先运行语法检查以捕获基本错误,再运行规范检查进行深入分析
  2. 对于 CREATE TABLE 语句,大型表始终应包含 PARTITIONED BY
  3. 使用 ORC 存储格式以获得更好的压缩效果和查询性能
  4. 查询分区表时始终添加分区筛选条件
  5. 使用 all 模式进行全面检查

参考资料

文档描述
AST SchemaHive SQL 的 AST 节点类型定义
Syntax Rules14 条语法检查规则定义
Specification Rules25 条规范检查规则定义
Performance Rules11 条大型 SQL 拦截规则定义
KeywordsHive SQL 关键字定义
Grammar Rules语句类型语法定义

说明

  1. 语法和规范检查不需要连接集群,可离线运行
  2. 大型 SQL 拦截规则旨在防止集群资源耗尽
  3. Hive 专用语法检查(PARTITIONED BY、CLUSTERED BY、STORED AS 等)基于 HiveQL 语法定义
  4. 检查引擎包含自定义分词器和递归下降解析器,无需外部 SQL 解析库
  5. **严格规则:只报告检查器引擎的输出。**绝不添加人工分析、“深入分析”、逻辑审查,或任何超出已定义规则(SYN-ERR/SYN001-SYN013、SPEC001-SPEC025、INTERCEPT001-INTERCEPT011)检测范围的发现。如果检查器显示 0 项违规,答案就是 0 项违规——不要补充其他内容。

评论

支持 Markdown