有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用HiveJDBC驱动程序在列名中使用特殊字符?

我有一个java程序,它使用Hortonworks的JDBC驱动程序连接到VirtualBox中的数据库。一切都很好,但我对sql查询中的冒号有问题

query = new StringBuilder("SELECT ROW_NUMBER() OVER() AS "+rowid+", * FROM "+tableName).toString();

我试图设置的rowid是“:rowid:”。我在前面和后面添加冒号,使列名对于其他应用程序是唯一的。现在冒号必须在那里,我想知道是否有一种方法可以通过官方网站上的Hortonworks JDBC驱动程序来实现。我已经在没有结肠的情况下测试过了,这会起作用的

使用冒号时,会显示错误消息:

JDBC driver version: HiveJDBC 01.00.36.1046 java.sql.SQLException: [Simba]HiveJDBCDriver ERROR processing query/statement. Error Code: 40000, SQL state: TStatus(statusCode:ERROR_STATUS, infoMessages:[*org.apache.hive.service.cli.HiveSQLException:Error while compiling statement: FAILED: ParseException line 1:30 cannot recognize input near 'AS' ':' 'rowid' in selection target:17:16, org.apache.hive.service.cli.operation.Operation:toSQLException:Operation.java:335, org.apache.hive.service.cli.operation.SQLOperation:prepare:SQLOperation.java:148, org.apache.hive.service.cli.operation.SQLOperation:runInternal:SQLOperation.java:226, org.apache.hive.service.cli.operation.Operation:run:Operation.java:276, org.apache.hive.service.cli.session.HiveSessionImpl:executeStatementInternal:HiveSessionImpl.java:468, org.apache.hive.service.cli.session.HiveSessionImpl:executeStatementAsync:HiveSessionImpl.java:456, org.apache.hive.service.cli.CLIService:executeStatementAsync:CLIService.java:298, org.apache.hive.service.cli.thrift.ThriftCLIService:ExecuteStatement:ThriftCLIService.java:506, org.apache.hive.service.cli.thrift.TCLIService$Processor$ExecuteStatement:getResult:TCLIService.java:1317, org.apache.hive.service.cli.thrift.TCLIService$Processor$ExecuteStatement:getResult:TCLIService.java:1302, org.apache.thrift.ProcessFunction:process:ProcessFunction.java:39, org.apache.thrift.TBaseProcessor:process:TBaseProcessor.java:39, org.apache.hive.service.auth.TSetIpAddressProcessor:process:TSetIpAddressProcessor.java:56, org.apache.thrift.server.TThreadPoolServer$WorkerProcess:run:TThreadPoolServer.java:286, java.util.concurrent.ThreadPoolExecutor:runWorker:ThreadPoolExecutor.java:1145, java.util.concurrent.ThreadPoolExecutor$Worker:run:ThreadPoolExecutor.java:615, java.lang.Thread:run:Thread.java:745, *org.apache.hadoop.hive.ql.parse.ParseException:line 1:30 cannot recognize input near 'AS' ':' 'rowid' in selection target:22:6, org.apache.hadoop.hive.ql.parse.ParseDriver:parse:ParseDriver.java:205, org.apache.hadoop.hive.ql.parse.ParseDriver:parse:ParseDriver.java:166, org.apache.hadoop.hive.ql.Driver:compile:Driver.java:437, org.apache.hadoop.hive.ql.Driver:compile:Driver.java:320, org.apache.hadoop.hive.ql.Driver:compileInternal:Driver.java:1219, org.apache.hadoop.hive.ql.Driver:compileAndRespond:Driver.java:1213, org.apache.hive.service.cli.operation.SQLOperation:prepare:SQLOperation.java:146], sqlState:42000, errorCode:40000, errorMessage:Error while compiling statement: FAILED: ParseException line 1:30 cannot recognize input near 'AS' ':' 'rowid' in selection target), Query: SELECT ROW_NUMBER() OVER() AS :rowid:, * FROM input. at com.simba.hiveserver2.hivecommon.api.HS2Client.executeStatementInternal(Unknown Source) at com.simba.hiveserver2.hivecommon.api.HS2Client.executeStatement(Unknown Source) at com.simba.hiveserver2.hivecommon.dataengine.HiveJDBCNativeQueryExecutor.executeQuery(Unknown Source) at com.simba.hiveserver2.hivecommon.dataengine.HiveJDBCNativeQueryExecutor.(Unknown Source) at com.simba.hiveserver2.hivecommon.dataengine.HiveJDBCDataEngine.prepare(Unknown Source) at com.simba.hiveserver2.jdbc.common.SStatement.executeNoParams(Unknown Source) at com.simba.hiveserver2.jdbc.common.SStatement.executeQuery(Unknown Source)

有人知道吗?我试图在字符串中添加“and”,但它们都给出了错误


共 (1) 个答案

  1. # 1 楼答案

    列名中的特殊字符应该用倒勾(`)字符括起来:

    new StringBuilder("SELECT ROW_NUMBER() OVER() as `"+rowid+"`, * FROM "+tableName).toString();
    

    阅读Supporting Quoted Identifiers in Column Names了解更多详细信息