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

Posted

技术标签:

【中文标题】如何使用 HIVE JDBC 驱动程序在列名中使用特殊字符?【英文标题】:How to use special character in column name using HIVE JDBC driver? 【发布时间】:2016-10-27 18:57:10 【问题描述】:

我有一个 java 程序,它使用 Hortonworks 的 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 错误处理查询/语句。错误代码:40000,SQL 状态:TStatus(statusCode:ERROR_STATUS, infoMessages:[*org.apache.hive.service.cli.HiveSQLException:Error while compile statement: FAILED: ParseException line 1:30 cannot identify input near '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:comp ile: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 compile statement: FAILED: ParseException line 1:30 cannot identify input near 'AS' ':' 'rowid' in selection target), Query: SELECT ROW_NUMBER() OVER() AS :rowid:, * FROM input。 在 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(Unknown Source)

有人知道吗?我尝试在字符串中添加 ' 和 \" ,但它们都给出了错误。

【问题讨论】:

【参考方案1】:

列名中的特殊字符需要用反引号(`)括起来:

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

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

【讨论】:

谢谢。这已关闭,但我将列名视为 _c0 而不是 :rowid: 我想要的。同样在我现在从结果集中检索的数据中,它变为 1:rowid: 2:rowid: 3:rowid: 对不起,也许我的问题令人困惑。我会尽力解释我想要什么。我想要的列名是“:rowid:”。单词rowid的前面和后面都有冒号。这样做的原因是使其名称唯一,因此没有其他列可以具有相同的名称。您提供的答案将生成列名作为 rowid 没有我想要的冒号。 知道了。立即尝试,它应该可以工作。我还添加了一个页面链接,可以帮助您了解特殊字符的行为。 Hive 从命令行也为所有没有反引号的标识符抛出此错误。所以我建议您编辑您的问题以使其更通用。

以上是关于如何使用 HIVE JDBC 驱动程序在列名中使用特殊字符?的主要内容,如果未能解决你的问题,请参考以下文章

Hive:在列名中使用 Concat

在 Spark 中使用 jdbc 驱动程序连接到 Hive

如何使用 spark 获取 hive 分区列名

Groovy JDBC 应用程序中的 SQL 列名?

如何更改 hive 中的列名

java - 如何在java jdbc中使用sqoop从sql server导入hive?