开发者社区> 问答> 正文

格式化hive create语句,当库名为default时报错

String dbType = JdbcConstants.HIVE; String sql = "CREATE TABLE IF NOT EXISTS default.create_test (id int COMMENT '学号', name string COMMENT '姓名');"; String sqlBeauty = SQLUtils.format(sql , dbType); System.out.println(sqlBeauty);

报错:

[2019-02-22 17:18:36,783] WARN
format error com.alibaba.druid.sql.parser.ParserException: error pos 34, line 1, column 27, token DEFAULT at com.alibaba.druid.sql.parser.SQLExprParser.name(SQLExprParser.java:1370) at com.alibaba.druid.sql.dialect.hive.parser.HiveCreateTableParser.parseCreateTable(HiveCreateTableParser.java:71) at com.alibaba.druid.sql.parser.SQLStatementParser.parseCreate(SQLStatementParser.java:2028) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:161) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:72) at com.alibaba.druid.sql.SQLUtils.format(SQLUtils.java:255) at com.alibaba.druid.sql.SQLUtils.format(SQLUtils.java:241) at com.inspur.tax.sjjggl.common.util.SqlParserUtil.main(SqlParserUtil.java:75) CREATE TABLE IF NOT EXISTS default.create_test (id int COMMENT '学号', name string COMMENT '姓名');

Process finished with exit code 0

其他库名格式化正常

原提问者GitHub用户muzhix

展开
收起
山海行 2023-07-05 19:41:09 75 0
2 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    当格式化Hive的CREATE TABLE语句时,当库(database)名称为default时会报错。

    这 likely 是一个SQLFormatter的bug。

    Hive中,列名、表名、库名不能使用关键字,比如default。

    但是有些SQLFormatter认为default是一个有效的名字,所以不会报错。

    当要执行这个CREATE语句时,Hive服务器上会报错表明default是关键字不能用。

    解决方案是:

    使用支持Hive的SQLFormatter,了解Hive的关键字与限制。

    自定义SQLFormatter,加入Hive关键字检查。

    改写直接使用Hive的SQL解析器执行检查。

    使用库名"default"时,加上``标识符引起来,可以规避此问题。

    2023-07-30 15:46:28
    赞同 展开评论 打赏
  • 问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14

    原回答者GitHub用户wenshao

    2023-07-06 11:04:41
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Hive Bucketing in Apache Spark 立即下载
spark替代HIVE实现ETL作业 立即下载
2019大数据技术公开课第五季—Hive迁移到MaxCompute最佳实践 立即下载