问题简单描述 hive ddl语句通过SQLUtils.formatHive方法进行格式转换时报com.alibaba.druid.sql.parser.ParserException: syntax error
使用版本 1.hive ddl语句由hive 2.1.1版本HiveMetaStoreClient获取。 2.druid版本1.2.3
示例
String createDdl = "create external table ods.ods_dc_test_df
( id
bigint comment 'id', name
string comment '名称' ) " + "comment '测试表' partitioned by ( dt
string ) " + "row format serde 'org.apache.hadoop.hive.ql.io.parquet.serde.parquethiveserde' " + "stored as inputformat 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' " + " outputformat 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' " + "location 'hdfs://dc/user/hive/warehouse/ods.db/ods_dc_test_df'" + " tblproperties ( parquet.compression = 'snappy' , transient_lastDdlTime = '1603362950' )";
String format = SQLUtils.formatHive(createDdl);
System.out.println(format);
报错
com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'es ( parquet.compression = 'snappy'', expect =, actual ., pos 486, line 1, column 486, token . at com.alibaba.druid.sql.parser.SQLParser.printError(SQLParser.java:558) at com.alibaba.druid.sql.parser.SQLParser.accept(SQLParser.java:566) at com.alibaba.druid.sql.dialect.hive.parser.HiveCreateTableParser.parseCreateTable(HiveCreateTableParser.java:299) at com.alibaba.druid.sql.parser.SQLCreateTableParser.parseCreateTable(SQLCreateTableParser.java:45) at com.alibaba.druid.sql.dialect.hive.parser.HiveStatementParser.parseCreateTable(HiveStatementParser.java:355) at com.alibaba.druid.sql.parser.SQLStatementParser.parseCreate(SQLStatementParser.java:3332) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:249) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:113) at com.alibaba.druid.sql.SQLUtils.format(SQLUtils.java:341) at com.alibaba.druid.sql.SQLUtils.format(SQLUtils.java:334) at com.alibaba.druid.sql.SQLUtils.format(SQLUtils.java:322) at com.alibaba.druid.sql.SQLUtils.formatHive(SQLUtils.java:213) at com.thorntree.bigdata.Sql.HiveParseSql.main(HiveParseSql.java:16)
原提问者GitHub用户thorntree
根据您提供的问题描述,看起来是在使用 Alibaba Druid 解析器(com.alibaba.druid.sql.parser.Parser)对 Hive DDL 语句进行格式化时出现了错误。这种错误可能是由于 Druid 解析器无法识别或者解析 Hive DDL 语句导致的。
为了解决这个问题,可以考虑以下几个方面:
检查 Hive DDL 语句的语法。在编写 Hive DDL 语句时,需要确保语法正确,遵循标准的 Hive DDL 语法规范和语法要求。可以使用 Hive 命令行工具或者其他工具来检查 Hive DDL 语句的语法和正确性。
查看 Druid 解析器的文档。Druid 解析器支持的 SQL 语句和语法可能与 Hive 不同,需要查阅 Druid 解析器的文档,了解其支持的 SQL 语句和语法要求。可以参考 Druid 解析器的官方文档或者其他相关资料。
尝试其他的 SQL 解析器。如果 Druid 解析器无法解析 Hive DDL 语句,可以尝试其他的 SQL 解析器,例如 Apache Calcite、ANTLR、JavaCC 等。这些解析器可以更好地支持各种 SQL 语句和语法。
手动编写格式化程序。如果使用现有的 SQL 解析器无法解析 Hive DDL 语句,可以考虑手动编写格式化程序,对 Hive DDL 语句进行格式化和调整。可以使用正则表达式或者其他工具来进行格式化和调整。
问题已修复,请用新版本
https://github.com/alibaba/druid/releases/tag/1.2.5
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。