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 
     */
    @Test
    public 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 error
        ParseDriver 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 ```java org.apache.spark spark-sql_2.12 3.1.2 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 selectList = sqlParser.getSelectList(); // 打印 SELECT 字段 for (Symbol symbol : selectList) { if (symbol instanceof Column) { System.out.println(((Column) symbol).getColumnName()); } } // 获取 FROM 表 List fromList = sqlParser.getFromList(); // 打印 FROM 表 for (Symbol symbol : fromList) { System.out.println(symbol.getName()); } } } ```

相关推荐
代码or搬砖38 分钟前
SQL核心语法总结:从基础操作到高级窗口函数
java·数据库·sql
1 小时前
TIDB——TIKV——读写与coprocessor
数据库·分布式·tidb·
Hello.Reader2 小时前
Flink SQL 的 LOAD MODULE 深度实战——加载 Hive 模块、理解模块发现与常见坑
hive·sql·flink
大猫和小黄2 小时前
若依微服务全面适配PostgreSQL-OpenGauss数据库
数据库·微服务·postgresql·若依
老徐电商数据笔记2 小时前
技术复盘第二篇:电商数据主题域划分企业级实践
大数据·数据库·数据仓库·零售·教育电商·技术面试
jfqqqqq2 小时前
postgres查询、重设自增序列的起始值
数据库·sql·postgres·自增序列
2 小时前
TIDB——PD(placement Driver)
java·数据库·分布式·tidb·
DemonAvenger2 小时前
Redis与MySQL双剑合璧:缓存更新策略与数据一致性保障
数据库·redis·性能优化
断春风2 小时前
如何避免 MySQL 死锁?——从原理到实战的系统性解决方案
数据库·mysql
闲人编程2 小时前
基础设施即代码(IaC)工具比较:Pulumi vs Terraform
java·数据库·terraform·iac·codecapsule·pulumi