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

时间:2016-10-27 18:57:10

标签: java jdbc hive

我有一个使用Hortonworks的Java程序' JDBC驱动程序连接到VirtualBox中的数据库。一切都运行良好,但我在SQL查询中的冒号有问题。

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

我想设置的rowid是":rowid:"。我在前面和后面添加冒号,使列名对于其他应用程序是唯一的。现在冒号必须在那里,我想知道是否有办法从官方网站使用Hortonworks JDBC Driver for Apache Hive(v1.0.36)。我已经在没有冒号的情况下对它进行了测试,这将有效。

使用冒号,错误消息:

  

JDBC驱动程序版本:HiveJDBC 01.00.36.1046   java.sql.SQLException:[Simba] HiveJDBCDriver ERROR处理查询/语句。错误代码:40000,SQL状态:TStatus(statusCode:ERROR_STATUS,infoMessages:[* org.apache.hive.service.cli.HiveSQLException:编译语句时出错:FAILED:ParseException行1:30无法识别'附近的输入AS'''' rowid'在选择目标中: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无法识别' AS'附近的输入':' ' ROWID'在选择目标: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:编译语句时出错:FAILED:ParseException行1:30无法识别' AS' ':' ' ROWID'在选择目标中),查询:SELECT ROW_NUMBER()OVER()AS:rowid:,* FROM输入。       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)       在com.simba.hiveserver2.hivecommon.dataengine.HiveJDBCNativeQueryExecutor。(未知来源)       在com.simba.hiveserver2.hivecommon.dataengine.HiveJDBCDataEngine.prepare(未知来源)       at com.simba.hiveserver2.jdbc.common.SStatement.executeNoParams(Unknown Source)       在com.simba.hiveserver2.jdbc.common.SStatement.executeQuery(未知来源)

有没有人有任何想法?我试图添加'和\"在字符串中,但它们都会出错。

1 个答案:

答案 0 :(得分:1)

列名中的特殊字符应该用反向标记(`)字符包围:

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

阅读Supporting Quoted Identifiers in Column Names了解详情。