【问题标题】:org.apache.hive.jdbc.HiveDriver: HiveBaseResultSet has not implemented absolute()?org.apache.hive.jdbc.HiveDriver:HiveBaseResultSet 没有实现 absolute()?
【发布时间】:2017-10-13 00:07:27
【问题描述】:

我刚开始使用驱动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()的原因是什么?

是否有解决此限制的方法?

【问题讨论】:

  • 您的问题是什么?我希望您知道 absolute(int) 方法是 1) 可选的,2) 预计会为仅向前的结果集(默认)抛出 SQLException
  • @Mark -- 好的。谢谢!现在我明白了。
  • 现在我更改了我的应用程序以避免调用 absolute() 并且我通过了该错误。现在我看到另一个错误: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) 。所以现在问题转移到commit() 我该如何解决这个问题?谢谢!

标签: hadoop apache-spark jdbc hive thrift


【解决方案1】:

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

absolute() 的实现是可选的

正如ResultSet#absolute() (link) 的接口所指定,absolute() 的实现是可选的——尤其是当结果集类型为TYPE_FORWARD_ONLY 时。

解决方法

在我的例子中,结果集来自 Spark Thrift 服务器 (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:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2017-04-28
    • 2020-08-08
    • 1970-01-01
    • 2023-03-31
    • 2017-12-27
    相关资源
    最近更新 更多