当前位置: 首页 > news >正文

SQL Parser

https://blog.csdn.net/w1047667241/article/details/123110220

alibaba druid

经过不断迭代,已经解决了很多 hive解析的bug,比如 2020年的create tablebug
支持的db type 多,impala ,hive ,oracle 等等都支持 。
缺点就是捆绑销售,1个jar 包高大全的 datasource 全家桶。我们只是想要 parser 而已。
老版本的 sql 解析会有bug,但是新版本的已经解决。测试了 一些复杂 语句,都能正确 解析。
对比 hive 本身的 parser ast 的操作,还需要自己分析 token,实在是太那个了。
二者对比参考代码

    /*** hive-sql-parser versus druid-sql-parser */@Testpublic void testDruidSqlParser() throws ParseException {String sql = "FROM (SELECT p.datekey datekey, p.userid userid, c.clienttype  FROM detail.usersequence_client c JOIN fact.orderpayment p ON p.orderid = c.orderid  JOIN default.user du ON du.userid = p.userid WHERE p.datekey = 20131118 ) base  INSERT OVERWRITE TABLE `test`.`customer_kpi` SELECT base.datekey,   base.clienttype, count(distinct base.userid) buyer_count GROUP BY base.datekey, base.clienttype";final SQLStatementParser hive = SQLParserUtils.createSQLStatementParser(sql, DbType.hive);final SQLStatement statement = hive.parseStatement();System.out.println(statement);// as you can see , using this parseDriver will cause an errorParseDriver pd = new ParseDriver();ASTNode ast = pd.parse(sql);System.out.println(ast.dump());}/*** @return 解析树*/public static List<SQLStatement> parseStatements(String sql, String dbType) {try {return SQLUtils.parseStatements(sql, dbType);} catch (Exception e) {log.error(e.getMessage(), e);throw new RuntimeException("SQL格式错误");}}/** sql格式化*/public static void format(String sql, String dbType) {String sqlFormat = SQLUtils.format(sql, dbType);if (sql.equals(sqlFormat)) {throw new RuntimeException("SQL格式错误");}}

[Spark] https://spark.apache.org/docs/1.3.1/api/java/org/apache/spark/sql/SparkSQLParser.html

ChatGPT 生成case

<dependency><groupId>org.apache.spark</groupId><artifactId>spark-sql_2.12</artifactId><version>3.1.2</version>
</dependency>import org.apache.spark.sql.catalyst.AbstractSparkSQLParser;
import org.apache.spark.sql.catalyst.analysis.SimpleAnalyzer;
import org.apache.spark.sql.catalyst.parser.SqlParser;
import org.apache.spark.sql.catalyst.parser.SqlParserBase;
import org.apache.spark.sql.catalyst.symbols.Column;
import org.apache.spark.sql.catalyst.symbols.Symbol;import java.util.List;public class Main {public static void main(String[] args) {String sql = "SELECT a.id, b.name FROM table1 a JOIN table2 b ON a.id = b.id WHERE a.status = 'active'";// 创建 AbstractSparkSQLParser 实例AbstractSparkSQLParser parser = new AbstractSparkSQLParser(sql);// 解析 SQL 查询SqlParser sqlParser = parser.parseQuery();// 获取 SELECT 字段List<Symbol> selectList = sqlParser.getSelectList();// 打印 SELECT 字段for (Symbol symbol : selectList) {if (symbol instanceof Column) {System.out.println(((Column) symbol).getColumnName());}}// 获取 FROM 表List<Symbol> fromList = sqlParser.getFromList();// 打印 FROM 表for (Symbol symbol : fromList) {System.out.println(symbol.getName());}}
}

相关文章:

  • Docker学习历程
  • 2024/2最新升级ChatGPT Plus的方法
  • Mybatis中的sql-xml延迟加载机制
  • RocketMQ(二):领域模型(生产者、消费者)
  • 【C#】.net core 6.0 设置根目录下某个文件夹可访问,访问创建的图片等资源
  • 【每日一题】LeetCode——链表的中间结点
  • CTFshow web(php命令执行 45-49)
  • 《Python 网络爬虫简易速速上手小册》第7章:如何绕过反爬虫技术?(2024 最新版)
  • C语言的循环结构
  • Unity笔记:相机移动
  • VSCode 文件夹增加右键打开
  • Git详细讲解
  • 逆向工程:揭开科技神秘面纱的艺术
  • 华为配置访客接入WLAN网络示例(MAC优先的Portal认证)
  • 《低功耗方法学》翻译——附录B:UPF命令语法
  • __proto__ 和 prototype的关系
  • Javascript 原型链
  • java第三方包学习之lombok
  • JS学习笔记——闭包
  • laravel5.5 视图共享数据
  • OSS Web直传 (文件图片)
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 从0实现一个tiny react(三)生命周期
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 那些年我们用过的显示性能指标
  • 前端之Sass/Scss实战笔记
  • 什么软件可以剪辑音乐?
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 源码安装memcached和php memcache扩展
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​力扣解法汇总946-验证栈序列
  • #1015 : KMP算法
  • #WEB前端(HTML属性)
  • $ git push -u origin master 推送到远程库出错
  • (09)Hive——CTE 公共表达式
  • (4.10~4.16)
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .describe() python_Python-Win32com-Excel
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .net对接阿里云CSB服务
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET中winform传递参数至Url并获得返回值或文件
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • [ C++ ] STL---string类的模拟实现
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [C++]高精度 bign (重载运算符版本)
  • [cocos2d-x]关于CC_CALLBACK
  • [Everyday Mathematics]20150130
  • [ffmpeg] 定制滤波器
  • [Go WebSocket] 多房间的聊天室(三)自动清理无人房间
  • [HTML]HTML5实现可编辑表格
  • [IE9] IE9 RC版下载链接