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());