我刚刚开始使用驱动程序org.apache.hive.jdbc.HiveDriver(版本
带有Spark Thrift服务器(STS)的spark2)1.2.1(参考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()的原因是什么?

该限制是否有任何解决方法?

最佳答案

感谢Mark Rotteveel的提示。现在,我了解得更多了,让我发布对自己问题的答案。

absolute()的实现是可选的

ResultSet#absolute()接口(interface)(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获得可以与STS对话的应用程序

对于任何也在尝试此操作的人,这是我在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:

关于hadoop - org.apache.hive.jdbc.HiveDriver:HiveBaseResultSet没有实现absolute()吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43958596/

10-12 22:53