Java 如何使用配置单元JDBC驱动程序在列名中使用特殊字符?

Java 如何使用配置单元JDBC驱动程序在列名中使用特殊字符?,java,jdbc,hive,Java,Jdbc,Hive,我有一个java程序,它使用Hortonworks的JDBC驱动程序连接到VirtualBox中的数据库。一切都很好,但我对sql查询中的冒号有问题 query = new StringBuilder("SELECT ROW_NUMBER() OVER() AS "+rowid+", * FROM "+tableName).toString(); 我试图设置的rowid是“:rowid:”。我在前面和后面添加冒号,使列名对于其他应用程序是唯一的。现在冒号必须在那里,我想知道是否有一种方法可以通

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

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

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

JDBC驱动程序版本:HiveJDBC 01.00.36.1046 java.sql.SQLException:[Simba]HiveJDBCDriver处理查询/语句时出错。错误代码:40000,SQL状态:TStatus(状态代码:错误状态,信息消息:[*org.apache.hive.service.cli.HiveSQLException:编译语句时出错:失败:ParseException第1:30行无法识别选择目标17:16,org.apache.hive.service.cli.operation:toSQLException:operation.java:335,org.apache.hive.service.cli.operation.SQLOperation:prepare:SQLOperation:SQLOperation.java:148中“AS:”附近的输入,org.apache.hive.service.cli.operation.SQLOperation:runInternal:SQLOperation.java:226,org.apache.hive.service.cli.operation:run:operation:operation:java:276,org.apache.hive.service.cli.session.HiveSessionImpl:executeStatementInternal:HiveSessionImpl:468,org.apache.HiveSessionImpl:executeStatementSync:HiveSessionImpl.java:456,org.apache.hive.service.cli.CLIService:executeStatementSync:CLIService.java:298,org.apache.hive.service.cli.ThriftCLIService:ExecuteStatement:ThriftCLIService.java:506,org.apache.hive.service.cli.thrift.TCLIService$处理器$ExecuteStatement:getResult:TCLIService.java:1317,org.apache.hive.service.clift.TCLIService$essor$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.threadPoolServer$WorkerProcess:run:TThreadP:oolServer.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:1:30行无法识别选择目标中“AS.”rowid”附近的输入:22:6,或g、 ParseDriver:parse:Driver.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-while-compiled语句:FAILED:ParseException行1:30无法识别选择目标中“AS”“rowid”附近的输入),查询:SELECT ROW_NUMBER()OVER()AS:rowid:,*来自输入。 位于com.simba.hiveserver2.hivecommon.api.HS2Client.executeStatementInternal(未知源) 位于com.simba.hiveserver2.hivecommon.api.HS2Client.executeStatement(未知源) 位于com.simba.hiveserver2.hivecommon.dataengine.HiveJDBCNativeQueryExecutor.executeQuery(未知源) 位于com.simba.hiveserver2.hivecommon.dataengine.HiveJDBCNativeQueryExecutor。(未知来源) 位于com.simba.hiveserver2.hivecommon.dataengine.HiveJDBCDataEngine.prepare(未知源) 位于com.simba.hiveserver2.jdbc.common.SStatement.executeNoParams(未知源) 位于com.simba.hiveserver2.jdbc.common.SStatement.executeQuery(未知源)


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

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

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

阅读以了解更多详细信息。

谢谢。此操作已关闭,但我将列名视为_c0,而不是我想要的:rowid:。此外,在我现在从结果集中检索的数据中,它将变为1:rowid:2:rowid:3:rowid:抱歉,可能我的问题让人困惑。我将尽力解释我想要的内容。我想要的列名是:rowid:"。rowid一词的前后都有冒号。这样做的原因是为了使其具有唯一的名称,以便其他列不能具有相同的名称。您提供的答案将生成作为rowid的列名,而不包含我想要的冒号。明白了。现在试试,应该可以了。我还添加了一个页面链接,可以帮助您理解speci所有字符的行为。配置单元在命令行中也会对所有标识符抛出此错误,但不加反勾。因此,我建议您编辑您的问题,使其更通用。