我刚开始使用驱动程序org.apache.hive.jdbc.HiveDriver
(版本
1.2.1 for spark2)使用Spark Thrift Server(STS)(参考here)
java.sql.ResultSet
定义方法absolute()
(JavaDoc here)
但HiveBaseResultSet
似乎已选择不实施该方法(源代码here)
所以现在我的应用程序(构建在SmartGWT
之上)正在执行一个简单的操作,我收到以下错误消息:
=== 2017-05-13 18:06:16,980 [3-47] WARN RequestContext - dsRequest.execute() failed:
java.sql.SQLException: Method not supported
at org.apache.hive.jdbc.HiveBaseResultSet.absolute(HiveBaseResultSet.java:70)
at org.apache.commons.dbcp.DelegatingResultSet.absolute(DelegatingResultSet.java:373)
at com.isomorphic.sql.SQLDataSource.executeWindowedSelect(SQLDataSource.java:2970)
at com.isomorphic.sql.SQLDataSource.SQLExecute(SQLDataSource.java:2024)
司机选择不实施absolute()
的原因是什么?
该限制是否有解决方法?
答案 0 :(得分:1)
感谢Mark Rotteveel的暗示。现在我明白了,让我回答一下我自己的问题。
绝对()的实施是可选的
由ResultSet#absolute()
(link)的接口指定,absolute()
的实现是可选的 - 尤其是当结果集类型为TYPE_FORWARD_ONLY
时。
解决方法强>
在我的情况下,结果集来自Spark Thrift Server(STS),所以我猜它确实是前向的。所以问题就变成了如何指示我的应用程序不要调用absolute()
,这基本上是为了光标移动。
SmartGWT特定答案
对于SmartGWT
,这是由名为sqlPaging
的属性控制的,我们可以为OperationBinding
指定。正确使用的值似乎是dropAtServer
(更多参考here)。所以我将我的SmartGWT DataSource XML文件设置为这样的
<operationBindings>
<operationBinding operationType="fetch" progressiveLoading="false"
sqlPaging="dropAtServer"
>
之后我看到另一个错误,现在与HiveConnection#commit()
:
java.sql.SQLException: Method not supported
at org.apache.hive.jdbc.HiveConnection.commit(HiveConnection.java:742)
at org.apache.commons.dbcp.DelegatingConnection.commit(DelegatingConnection.java:334)
at com.isomorphic.sql.SQLTransaction.commitTransaction(SQLTransaction.java:307)
at com.isomorphic.sql.SQLDataSource.commit(SQLDataSource.java:4673)
经过多次挖掘,我意识到SmartGWT控制提交行为的正确属性是autoJoinTransactions
,我应该将其设置为false(更多参考here)。经过这两次更改后,我可以通过jdbc.HiveDriver
对于那些也在尝试此操作的人,以下是我在SmartGWT server.properties
(更多参考here)
sql.defaultDatabase: perf2 # this name is picked by me, but it can be anyname
sql.perf2.driver.networkProtocol: tcp
sql.perf2.driver: org.apache.hive.jdbc.HiveDriver # important
sql.perf2.database.type: generic # important
sql.perf2.autoJoinTransactions: false # important
sql.perf2.interface.type: driverManager # important
sql.perf2.driver.url: jdbc:hive2://host:port # important -- pick your host:port
sql.perf2.driver.user: someuser # important -- pick your username
sql.perf2.interface.credentialsInURL: true
sql.perf2.driver.databaseName: someDb
sql.perf2.driver.context: