【flink】sql文件解析提交

SqlRunner

import org.apache.commons.lang.StringUtils;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.configuration.RestOptions;
import org.apache.flink.table.api.TableEnvironment;
import org.apache.flink.util.FileUtils;


import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * Main class for executing SQL scripts.
 */
public class SqlRunner {

//    private static final Logger LOG = LoggerFactory.getLogger(SqlRunner.class);

    private static final String STATEMENT_DELIMITER = ";"; // a statement should end with `;`
    private static final String LINE_DELIMITER = "\n";

    private static final String COMMENT_PATTERN = "(--.*)|(((\\/\\*)+?[\\w\\W]+?(\\*\\/)+))";

    public static void main(String[] args) throws Exception {
        if (args.length != 1) {
            throw new Exception("Exactly one argument is expected.");
        }

//        ParameterTool parameters = ParameterTool.fromArgs(args);

        String script = FileUtils.readFileUtf8(new File(args[0]));
        List<String> statements = parseStatements(script);

        Configuration conf = new Configuration();
        conf.setString(RestOptions.BIND_PORT, "8081");

        TableEnvironment tableEnv = TableEnvironment.create(conf);

        for (String statement : statements) {
//            LOG.info("Executing:\n{}", statement);
            tableEnv.executeSql(statement);
        }
    }

    public static List<String> parseStatements(String script) {
        String formatted = formatSqlFile(script).replaceAll(COMMENT_PATTERN, "");
        List<String> statements = new ArrayList<>();

        StringBuilder current = null;
        boolean statementSet = false;
        for (String line : formatted.split("\n")) {
            String trimmed = line.trim();

            if (StringUtils.isBlank(trimmed)) {
                continue;
            }
            if (current == null) {
                current = new StringBuilder();
            }
            if (trimmed.startsWith("EXECUTE STATEMENT SET")) {
                statementSet = true;
            }
            current.append(trimmed);
            current.append("\n");
            if (trimmed.endsWith(STATEMENT_DELIMITER)) {
                if (!statementSet || trimmed.equals("END;")) {
                    statements.add(current.toString());
                    current = null;
                    statementSet = false;
                }
            }
        }
        return statements;
    }

    public static String formatSqlFile(String content) {
        String trimmed = content.trim();
        StringBuilder formatted = new StringBuilder();
        formatted.append(trimmed);
        if (!trimmed.endsWith(STATEMENT_DELIMITER)) {
            formatted.append(STATEMENT_DELIMITER);
        }
        formatted.append(LINE_DELIMITER);
        return formatted.toString();
    }
}

FlinkSqlParse

public static List<String> parseFlinkSql(String sql) {
        List<String> sqlList = new ArrayList<>();
        if (sql != null && !sql.isEmpty()) {
            try {
                SqlParser parser = SqlParser.create(sql, SqlParser.configBuilder()
                        .setParserFactory(FlinkSqlParserImpl.FACTORY)
                        .setQuoting(Quoting.BACK_TICK)
                        .setUnquotedCasing(Casing.TO_LOWER)   //字段名统一转化为小写
                        .setQuotedCasing(Casing.UNCHANGED)
                        .setConformance(FlinkSqlConformance.DEFAULT)
                        .build()
                );
                List<SqlNode> sqlNodeList = parser.parseStmtList().getList();
                if (sqlNodeList != null && !sqlNodeList.isEmpty()) {
                    for (SqlNode sqlNode : sqlNodeList) {
                        sqlList.add(sqlNode.toString());
                    }
                }
            } catch (Exception e) {
//                log.error("sql语句解析失败");
            }
        }

        return sqlList;
    }

测试

 String sql = "create table cust_http_post_source                                                              "
                + "(                                                                                               "
                + "    id   int,                                                                                   "
                + "    name string                                                                                 "
                + ")WITH(                                                                                          "
                + " 'connector' = 'http',                                                                          "
                + " 'http.url' = 'http://mock.apifox.cn/m1/2518376-0-default/test/flink/post/order',               "
                + " 'http.mode' = 'post',                                                                          "
                + "                 'read.streaming.enabled' = 'true',                                                             "
                + " 'read.streaming.check-interval' = '10',                                                        "
                + " 'format' = 'json'                                                                              "
                + ")                                                                                               ";

        List<String> strings = parseFlinkSql(sql);
        System.out.println(strings.toString());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值