spark idea源码阅读 SqlBaseParser 无法找到解决
背景
使用idea阅读spark 源码时,如果是第一次导入,会碰到 org.apache.spark.sql.catalyst.parser.SqlBaseParser
包下相关的类无法找到的问题。
如 AstBuilder
继承 SqlBaseBaseVisitor
,SqlBaseBaseVisitor
就无法找到。
原因
org.apache.spark.sql.catalyst.parser.SqlBaseParser
包下相关的代码并不是人工写的源码,而是antlr4框架自动生成的代码,因为代码没有生成,所以idea无法找到相关代码。
antlr4是什么?
- antlr github 地址
- antlr 官网 地址
ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, or translating structured text or binary files. It’s widely used to build languages, tools, and frameworks. From a grammar, ANTLR generates a parser that can build parse trees and also generates a listener interface (or visitor) that makes it easy to respond to the recognition of phrases of interest.
ANTLR(另一种语言识别工具)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。 它广泛用于构建语言、工具和框架。 从语法中,ANTLR 生成一个可以构建解析树的解析器,还生成一个侦听器接口(或访问者),可以轻松响应对感兴趣短语的识别。
简单来说就是定义语言此法和语法的框架,比如sql的解析。
对应的同类产品有:
- 在 C/C++ 开发环境下比较有名的 Flex、 Yacc 等;
- 在 Java 的世 界里,词法分析工具有 JFlex,语法分析工具有 BYACC/J、 Java Cup,兼具两者的有 JavaCC 和 ANTLR等
spark使用antlr4干什么?
spark使用antlr4来解析sql语法,生成语法树,之后应用语法树生成相关逻辑树及最后的物理执行计划。
如果你对sparksql 采用antlr4 解析比较感兴趣,这里推荐
ANTLR4-SqlBase这个开源项目,该作者为 《Spakr SQL内核剖析》 一书作者剥离的Parser模块,用于查看Spark SQL语法解析SQL后生成的语法树的项目。
解决方法
使用antlr4插件生成代码,并将相关代码引入到classpath中。
1、安装antlr4插件
本人mac系统
在 intellij Idea->Preference->Plugins
下搜索 antlr4,安装插件
2、使用antlr4插件生成代码
2.1 使用antlr4语法文件SqlBase.g4生成对应的代码
找到SqlBase.g4文件,该文件在sql/catalyst/src/main/antlr4/org.apache.spark.sql.catalyst.parser下
右键,找到antlr4插件的Generate ANTLR Recognizer选项,点击
如下图所示
会在 sql/catalyst 下创建gen文件夹,生成对应的代码,如果想修改目录,可以点击configure ANTLR修改,这里直接默认的就好
生成的代码结构如下图
2.2 将相关代码导入 classpath
选中再上一步生成的gen文件,右键,找到Mark Directory as -> Sources Root,将该文件夹设置为代码跟路径,这样idea就会将该文件夹添加到classpath中并编译。
再次查看AstBuilder代码,此时红色错误已消失,代码已找到
至此,相关问题已解决。